Docker 学习历程(一)
前几天看到 Arch 上的 pacman
非常的好用,但是我在安装 Manjaro 遇到了很多问题。所以就在服务器上尝试一下 Arch。使用 Docker 可以在任意 Linux 内核上运行其他 Linux 发行版。使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
开始前的准备
我的服务器是 Ubuntu,所以首先安装 Docker。
apt install docker
基本命令
- 拉取 Arch 镜像。
docker pull archlinux/base
这样就把 Arch 的存储到了本地,可以通过 docker image list
查看所有的本地镜像。
root@lnmp:~/docker# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
arch v1 9a4034dda227 3 hours ago 594MB
<none> <none> 20b81ab423c2 3 hours ago 458MB
nginx latest f68d6e55e065 4 days ago 109MB
archlinux/base latest 98e93880f9b1 4 days ago 458MB
bash latest 417531d957ab 8 weeks ago 15.2MB
- 启动一个 Docker 容器
用 docker run
启动一个 Docker 容器。
在此之前了解镜像和容器之间的关系。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
docker run -it --name arch archlinux/base
-i
是交互模式,-t
是开始一个 tty。--name
给这个容器命名。后面紧跟着镜像名。
然后将会进入 Arch 的 tty 字符终端。
除此之外,常用的参数还有-d
后台运行。
从后台进入容器的 tty 终端则可以用,docker exec -it arch bash
arch
是之前的命名,bash
是容器内的命令。这里打开一个 shell。
- 查看容器运行状态
docker ps -a
表示查看所有的容器状态。
root@lnmp:~/hugo/quickstart# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72e8ede0f2c8 archlinux/base "/usr/bin/bash" 13 seconds ago Up 12 seconds arch
02243150a4a8 archlinux/base "--name arch" 7 minutes ago Created reverent_wing
d44d03201e87 nginx "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:8080->80/tcp web
- 删除一个容器
docker rm 3dd93022c1b2
,后面的是容器的 ID,或者名字。
- 停止一个容器
docker stop arch
,也是跟的 ID 或者名字。启动自然不用说了。
- 保存一个容器至镜像
为什么要保存为镜像?
现在我们定制好了变化,我们希望能将其保存下来形成镜像。
要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
使用 docker commit
与 git commit
一样加入版本库。
root@lnmp:~# docker commit --author "Innei" --message "init" a2 arch:v1
sha256:9a4034dda227606da0e621fd448d741d1e4b28137a65069575bccf823581bd65
我们可以在 docker image ls 中看到这个新定制的镜像:
bash
root@lnmp:~/docker# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
arch v1 9a4034dda227 3 hours ago 594MB
<none> <none> 20b81ab423c2 4 hours ago 458MB
nginx latest f68d6e55e065 4 days ago 109MB
archlinux/base latest 98e93880f9b1 4 days ago 458MB
bash latest 417531d957ab 8 weeks ago 15.2MB
- 容器内端口映射
内部的容器是一个隔离的环境,若需要开启端口供外界访问则需要开始端口映射。
下面以 Nginx 为例。
# 拉取 nginx
docker pull nginx
docker run --name webserver -d -p 8080:80 nginx
-p
开启端口映射,外部端口:内部端口。8080:80
表示内部 80 -> 外部 8080。
现在通过外部 IP 访问 8080 端口将会看到: