一、容器使用
1.获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像:
1 | docker pull ubuntu |
2.启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
1 | docker run -it ubuntu /bin/bash |
参数说明:
- i: 交互式操作。
- t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
要退出终端,直接输入 exit:
1 | root@a66766153195:/# exit |
3启动已停止运行的容器
查看所有的容器命令如下:
1 | docker ps -a |
使用 docker start 启动一个已停止的容器:
1 | docker start 59d7601fde38 |
4后台运行
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
1 | docker run -itd --name ubuntu-test ubuntu /bin/bas |
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)。
5停止一个容器
1 | docker stop <容器 ID> |
停止的容器可以通过 docker restart 重启:
1 | docker restart <容器 ID> |
6进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
- docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
1 | docker exec -it d162c8a4d084 /bin/bash |
7导出和导入容器
a导出容器
如果要导出本地某个容器,可以使用 docker export 命令。
1 | docker export 1e560fca3906 > ubuntu.tar |
这样将导出容器快照到本地文件。
b导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
1 | cat docker/ubuntu.tar | docker import - test/ubuntu:v1 |
此外,也可以通过指定 URL 或者某个目录来导入,例如:
1 | docker import http://example.com/exampleimage.tgz example/imagerepo |
8删除容器
删除容器使用 docker rm 命令:
1 | docker rm -f 1e560fca3906 |
总结
镜像,容器命令关系图如下图所示
二、运行一个web应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
1 | docker pull training/webapp |
这里多了端口信息。
1 | 0.0.0.0:32768->5000/tcp adoring_hopper |
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32769 上。
这时我们可以通过浏览器访问WEB应用
1 查看 WEB 应用程序日志查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
- f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
2 查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
3.检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
三、Docker镜像使用
1.列出镜像列表
1 | docker images |
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
1 | C:\Users\xiaow>docker run -it ubuntu:15.10 /bin/bash |
参数说明:
- i: 交互式操作。
- t: 终端。
- ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
2.获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
1 | docker pull ubuntu:15.10 |
下载完成后,我们可以直接使用这个镜像来运行容器。
3查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
4 拖取镜像
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
1 | C:\Users\xiaow>docker pull httpd |
下载完成后,我们就可以使用这个镜像了。
1 | docker run httpd |
5 删除镜像
镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:
1 | docker rmi hello-world |
6 创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1、从已经创建的容器中更新镜像,并且提交这个镜像
- 2、使用 Dockerfile 指令来创建一个新的镜像
a 更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
1 | C:\Users\xiaow>docker run -it ubuntu:15.10 /bin/bash |
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 ff61c4fac64f
的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
1 | C:\Users\xiaow>docker commit -m="has update" -a="Sn0wm1an" ff61c4fac64f Sn0wm1an/ubuntu:v2 |
各个参数说明:
- m: 提交的描述信息
- a: 指定镜像作者
- e218edb10161:容器 ID
- runoob/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 Sn0wm1an**/ubuntu:v2**:
使用我们的新镜像 Sn0wm1an**/ubuntu** 来启动一个容器
四、进阶使用方法
1.Docker 容器连接
前面我们实现了通过网络端口来访问运行在 docker 容器内的服务。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
下面我们来实现通过端口连接到一个 docker 容器。
a.端口映射
我们创建了一个 python 应用的容器。
1 | docker run -d -P training/webapp python app.py |
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
我们使用 -P 绑定端口号,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32768。
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
- P :是容器内部端口随机映射到主机的端口。
- p : 是容器内部端口绑定到指定的主机端口。
1 | docker run -d -p 5000:5000 training/webapp python app.py |
bDocker 容器互联
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 –name 标识来命名容器,例如:
1 | docker run -d -P --name Sn0wm1an training/webapp python app.py |
新建网络
下面先创建一个新的 Docker 网络。
1 | docker network create -d bridge test-net |
参数说明:
- d:参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
连接容器
运行一个容器并连接到新建的 test-net 网络:
1 | docker run -itd --name test1 --network test-net ubuntu /bin/bash |
打开新的终端,再运行一个容器并加入到 test-net 网络:
1 | $ docker run -itd --name test2 --network test-net ubuntu /bin/bash |
c 配置 DNS
我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:
1 | { |
设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。
配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息: