runoob-docker教程
命令小结
// 运行一个docker
[root@VM_0_7_centos hitchhiker]# docker run ubuntu:15.10 /bin/echo "Hello world"
// 停止容器
docker stop 容器ID或容器名称
// 启动容器
docker start 容器id或容器名称
// 重新启动容器
docker restart 容器id或容器名称
// 查询最后一次创建的容器
docker ps -l
// 我们可以使用 docker rm 命令来删除不需要的容器
docker rm 容器id或容器名称
// 运行交互式的容器【-t:在新容器内指定一个伪终端或终端。-i:允许你对容器内的标准输入 (STDIN) 进行交互。】
[root@VM_0_7_centos hitchhiker]# docker run -i -t ubuntu:15.10 /bin/bash
// 启动容器(后台模式)
[root@VM_0_7_centos hitchhiker]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
// 查看日志【-f:可选, 让 dokcer logs 像使用 tail -f 一样来输出容器内部的标准输出。】
docker logs -f 容器ID或容器名称
// 查看命令的使用
docker command --help
// 载入镜像并运行它【-d:让容器在后台运行。-P:将容器内部使用的网络端口映射到我们使用的主机上。】
runoob@runoob:~# docker pull training/webapp # 载入镜像【当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。】
runoob@runoob:~# docker run -d -P training/webapp python app.py
我们也可以使用 -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P :是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。
docker run -d -p 5000:5000 training/webapp python app.py
可以指定容器绑定的网络地址,比如绑定127.0.0.1。
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
上面的例子中,默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
// 容器的端口映射
docker port 容器id或名称
// docker port 命令可以让我们快捷地查看端口的绑定情况。
docker port 容器id或容器名称 容器端口(不是本机端口)
// 查看容器内部运行的进程
docker top 容器id或名称
// 使用 `docker inspect 容器id或名称` 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect 容器id或名称
// 列出镜像列表
docker images
// 查找镜像
docker search 镜像名
// 更新镜像【通过命令 docker commit来提交容器副本。】
runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
【-m:提交的描述信息, -a:指定镜像作者, e218edb10161:容器ID, runoob/ubuntu:v2:指定要创建的目标镜像名】
// 构建镜像
1. vim Dockerfile
2. docker build -t runoob/centos:6.7 .【-t :指定要创建的目标镜像名】
// 设置镜像标签, 我们可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag 860c279d2fec runoob/centos:dev
// 容器命名, 当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器,例如:
docker run -d -P --name runoob training/webapp python app.py
docker使用
Docker Hello World
Docker Hello World
Docker 允许你在容器内运行应用程序, 使用 docker run
命令来在容器内运行一个应用程序。
输出 Hello world
[root@VM_0_7_centos hitchhiker]# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
Trying to pull repository docker.io/library/ubuntu ...
15.10: Pulling from docker.io/library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:cc767eb612212f9f5f06cd1f4e0821d781a5f83bc24d1182128a1088907d3825
Status: Downloaded newer image for docker.io/ubuntu:15.10
Hello world
各个参数解析:
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库
Docker Hub
下载公共镜像。/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker
以 ubuntu15.10
镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world"
,然后输出结果。
运行交互式的容器
我们通过 docker
的两个参数 -i
-t
,让 docker
运行的容器实现 "对话" 的能力
[root@VM_0_7_centos hitchhiker]# docker run -i -t ubuntu:15.10 /bin/bash
root@f170a17caf1f:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@f170a17caf1f:/# cat /proc/version
Linux version 3.10.0-514.26.2.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Tue Jul 4 15:04:05 UTC 2017
root@f170a17caf1f:/#
各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
此时我们已进入一个 ubuntu15.10系统的容器
我们尝试在容器中运行命令 cat /proc/version
和 ls
分别查看当前系统的版本信息和当前目录下的文件列表
我们可以通过运行 exit
命令或者使用 CTRL+D
来退出容器。
启动容器(后台模式)
使用以下命令创建一个以进程方式运行的容器
[root@VM_0_7_centos hitchhiker]# docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
9b34d5ca1d2dc51160eaf1bda610b765ee922e2b58532972480fcdaf3cd84615
在输出中,我们没有看到期望的 "hello world"
,而是一串长字符
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
这个长字符串叫做 容器ID
,对每个容器来说都是唯一的,我们可以通过 容器ID
来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps
来查看
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b34d5ca1d2d ubuntu:15.10 "/bin/sh -c 'while..." 51 seconds ago Up 51 seconds kickass_goldwasser
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器内使用 docker logs 容器ID或容器名称
命令,查看容器内的标准输出
[root@VM_0_7_centos hitchhiker]# docker logs 9b34d5ca1d2d
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
或者
[root@VM_0_7_centos hitchhiker]# docker logs kickass_goldwasser
hello world
hello world
hello world
hello world
hello world
hello world
hello world
停止容器
我们使用 docker stop 容器ID或容器名称
命令来停止容器:
[root@VM_0_7_centos hitchhiker]# docker stop kickass_goldwasser
kickass_goldwasser
通过 docker ps
查看,容器已经停止工作:
Docker 容器使用
Docker 客户端
docker 客户端非常简单 ,我们可以直接输入 docker
命令来查看到 Docker 客户端的所有命令选项。
[root@VM_0_7_centos hitchhiker]# docker
Usage: docker COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/root/.docker")
-D, --debug Enable debug mode
--help Print usage
-H, --host list Daemon socket(s) to connect to (default [])
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
Management Commands:
container Manage containers
image Manage images
network Manage networks
node Manage Swarm nodes
可以通过命令 docker command --help
更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats
指令的具体使用方法:
[root@VM_0_7_centos hitchhiker]# docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--help Print usage
--no-stream Disable streaming stats and only pull the first result
运行一个web应用
前面我们运行的容器并没有一些什么特别的用处。
接下来让我们尝试使用 docker
构建一个 web
应用程序。
我们将在 docker
容器中运行一个 Python Flask
应用来运行一个 web
应用。
[root@VM_0_7_centos hitchhiker]# docker pull training/webapp # 载入镜像
Using default tag: latest
Trying to pull repository docker.io/training/webapp ...
latest: Pulling from docker.io/training/webapp
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for docker.io/training/webapp:latest
[root@VM_0_7_centos hitchhiker]# docker run -d -P training/webapp python app.py
6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
查看 WEB 应用容器
使用 docker ps
来查看我们正在运行的容器
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d22d16d383b training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:1024->5000/tcp festive_williams
这里多了端口信息。
PORTS
0.0.0.0:1024->5000/tcp
Docker 开放了 5000
端口(默认 Python Flask 端口)映射到主机端口 1024
上。
我们也可以指定 -p
标识来绑定指定端口。
[root@VM_0_7_centos hitchhiker]# docker run -d -p 8080:5000 training/webapp python app.py
73075bcba2c93d739f5db57c735985217ee4fed5624a195a1afa1b8c78b93806
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 8 seconds ago Up 8 seconds 0.0.0.0:8080->5000/tcp compassionate_carson
6d22d16d383b training/webapp "python app.py" 4 minutes ago Up 4 minutes 0.0.0.0:1024->5000/tcp festive_williams
容器内部的 5000
端口映射到我们本地主机的 1024
端口上。
网络端口的快捷方式
通过 docker ps
命令可以查看到容器的端口映射,docker
还提供了另一个快捷方式:docker port
,使用 docker port
可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的web应用容器ID为:6d22d16d383b
, 名字为:festive_williams
[root@VM_0_7_centos hitchhiker]# docker port 6d22d16d383b
5000/tcp -> 0.0.0.0:1024
[root@VM_0_7_centos hitchhiker]# docker port festive_williams
5000/tcp -> 0.0.0.0:1024
查看WEB应用程序日志
docker logs [ID或者名字]
可以查看容器内部的标准输出。
[root@VM_0_7_centos hitchhiker]# docker logs 6d22d16d383b
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[root@VM_0_7_centos hitchhiker]# docker logs festive_williams
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
[root@VM_0_7_centos hitchhiker]# docker logs -f compassionate_carson
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
36.24.24.126 - - [16/Apr/2018 09:10:26] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:10:26] "GET /favicon.ico HTTP/1.1" 404 -
36.24.24.126 - - [16/Apr/2018 09:14:38] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:14:45] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:15:20] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:15:22] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:00] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:09] "GET / HTTP/1.1" 200 -
36.24.24.126 - - [16/Apr/2018 09:23:10] "GET / HTTP/1.1" 200 -
-f:让 dokcer logs
像使用 tail -f
一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000
端口并且能够查看到应用程序的访问日志。
查看WEB应用程序容器的进程
我们还可以使用 docker top 容器id或容器名称
来查看容器内部运行的进程
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 14 minutes ago Up 14 minutes 0.0.0.0:8080->5000/tcp compassionate_carson
6d22d16d383b training/webapp "python app.py" 19 minutes ago Up 19 minutes 0.0.0.0:1024->5000/tcp festive_williams
[root@VM_0_7_centos hitchhiker]# docker top 73075bcba2c9
UID PID PPID C STIME TTY TIME CMD
root 20161 20146 0 17:09 ? 00:00:00 python app.py
检查WEB应用程序
使用 docker inspect 容器id或名称
来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
[root@VM_0_7_centos hitchhiker]# docker inspect 73075bcba2c9
[
{
"Id": "73075bcba2c93d739f5db57c735985217ee4fed5624a195a1afa1b8c78b93806",
"Created": "2018-04-16T09:09:31.512411201Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 20161,
"ExitCode": 0,
"Error": "",
"StartedAt": "2018-04-16T09:09:31.793624639Z",
停止WEB应用容器
docker stop id或名称
[root@VM_0_7_centos hitchhiker]# docker stop 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 17 minutes ago Up 17 minutes 0.0.0.0:8080->5000/tcp compassionate_carson
重启WEB应用容器
已经停止的容器,我们可以使用命令 docker start 容器id或容器名称
来启动。
[root@VM_0_7_centos hitchhiker]# docker start 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 18 minutes ago Up 18 minutes 0.0.0.0:8080->5000/tcp compassionate_carson
6d22d16d383b training/webapp "python app.py" 23 minutes ago Up 2 seconds 0.0.0.0:1025->5000/tcp festive_williams
docker ps -l
查询最后一次创建的容器:
[root@VM_0_7_centos hitchhiker]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 19 minutes ago Up 19 minutes 0.0.0.0:8080->5000/tcp compassionate_carson
正在运行的容器,我们可以使用 docker restart
命令来重启
移除WEB应用容器
我们可以使用 docker rm
命令来删除不需要的容器
[root@VM_0_7_centos hitchhiker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73075bcba2c9 training/webapp "python app.py" 20 minutes ago Up 20 minutes 0.0.0.0:8080->5000/tcp compassionate_carson
6d22d16d383b training/webapp "python app.py" 25 minutes ago Up About a minute 0.0.0.0:1025->5000/tcp festive_williams
[root@VM_0_7_centos hitchhiker]# docker rm 6d22d16d383b
Error response from daemon: You cannot remove a running container 6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118. Stop the container before attempting removal or use -f
[root@VM_0_7_centos hitchhiker]# docker stop 6d22d16d383b
6d22d16d383b
[root@VM_0_7_centos hitchhiker]# docker rm 6d22d16d383b
6d22d16d383b
删除容器时,容器必须是停止状态,否则会报如下错误
Error response from daemon: You cannot remove a running container 6d22d16d383b1d588ef8f93a1240b8672e2aff7ff8e84d5f34dbde67360db118. Stop the container before attempting removal or use -f
Docker 镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub
公共镜像源下载。
下面我们来学习:
1、管理和使用本地 Docker 主机镜像
2、创建镜像
列出镜像列表
我们可以使用 docker images
来列出本地主机上的镜像。
[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 5195076672a7 4 weeks ago 371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn v0.10 62db6828e252 4 weeks ago 1.23 GB
docker.io/brookshi/hitchhiker v0.10 ef0575e6ef11 4 weeks ago 1.23 GB
docker.io/ubuntu 15.10 9b9cb95443b5 21 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG
,代表这个仓库源的不同个版本,如 ubuntu
仓库源里,有 15.10
、14.04
等多个不同的版本,我们使用 REPOSITORY:TAG
来定义不同的镜像。
所以,我们如果要使用版本为 15.10
的 ubuntu
系统镜像来运行容器时,命令如下:
[root@VM_0_7_centos hitchhiker]# docker run -t -i ubuntu:15.10 /bin/bash
root@36b35bf2e140:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@36b35bf2e140:/#
如果要使用版本为 14.04
的 ubuntu
系统镜像来运行容器时,命令如下:
runoob@runoob:~$ docker run -t -i ubuntu:14.04 /bin/bash
root@39e968165990:/#
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest
镜像。
获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull
命令来下载它。
[root@VM_0_7_centos hitchhiker]# docker pull ubuntu:13.10
Trying to pull repository docker.io/library/ubuntu ...
13.10: Pulling from docker.io/library/ubuntu
a3ed95caeb02: Pull complete
0d8710fc57fd: Pull complete
5037c5cd623d: Pull complete
83b53423b49f: Pull complete
e9e8bd3b94ab: Pull complete
7db00e6b6e5e: Pull complete
Digest: sha256:403105e61e2d540187da20d837b6a6e92efc3eb4337da9c04c191fb5e28c44dc
Status: Downloaded newer image for docker.io/ubuntu:13.10
[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 5195076672a7 4 weeks ago 371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn v0.10 62db6828e252 4 weeks ago 1.23 GB
docker.io/brookshi/hitchhiker v0.10 ef0575e6ef11 4 weeks ago 1.23 GB
docker.io/ubuntu 15.10 9b9cb95443b5 21 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
docker.io/ubuntu 13.10 7f020f7bf345 3 years ago 185 MB
下载完成后,我们可以直接使用这个镜像来运行容器。
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search
命令来搜索镜像。比如我们需要一个 httpd
的镜像来作为我们的web服务。我们可以通过 docker search
命令搜索 httpd
来寻找适合我们的镜像。
[root@VM_0_7_centos hitchhiker]# docker search httpd
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/httpd The Apache HTTP Server Project 1634 [OK]
docker.io docker.io/hypriot/rpi-busybox-httpd Raspberry Pi compatible Docker Image with ... 40
docker.io docker.io/centos/httpd 16 [OK]
docker.io docker.io/centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or b... 10
docker.io docker.io/armhf/httpd The Apache HTTP Server Project 8
docker.io docker.io/macadmins/netboot-httpd use in combination with bruienne/bsdpy 5
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
拖取镜像
我们决定使用上图中的httpd 官方版本的镜像,使用命令 docker pull
来下载镜像。
[root@VM_0_7_centos hitchhiker]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
2a72cbf407d6: Already exists
04b2d3302d48: Pull complete
e7f619103861: Pull complete
Digest: sha256:cb29ee85b234f356fb8a77d8cfb78b42355f7f016f528f11a2a5f75e4862dc94
Status: Downloaded newer image for docker.io/nginx:latest
下载完成后,我们就可以使用这个镜像了。
[root@VM_0_7_centos hitchhiker]# docker run nginx
创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 1.从已经创建的容器中更新镜像,并且提交这个镜像
- 2.使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
[root@VM_0_7_centos hitchhiker]# clear
[root@VM_0_7_centos hitchhiker]# docker run -t -i ubuntu:15.10 /bin/bash
root@e814ae819a90:/#
在运行的容器内使用 apt-get update
命令进行更新。
在完成操作之后,输入 exit
命令来退出这个容器。
此时ID为 e814ae819a90
的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit
来提交容器副本。
[root@VM_0_7_centos hitchhiker]# docker commit -m="has update" -a="runoob" e814ae819a90 runoob/ubuntu:v2
sha256:4ddf6452c51c387cd9abc646a7af348fc6d0e471089d93b196cf2413f8a3745c
各个参数说明:
-m:提交的描述信息
-a:指定镜像作者
e814ae819a90:容器ID
runoob/ubuntu:v2:指定要创建的目标镜像名
我们可以使用 docker images
命令来查看我们的新镜像 runoob/ubuntu:v2
:
[root@VM_0_7_centos hitchhiker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/ubuntu v2 4ddf6452c51c About a minute ago 137 MB
docker.io/nginx latest b175e7467d66 5 days ago 109 MB
docker.io/mysql 5.7 5195076672a7 4 weeks ago 371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn v0.10 62db6828e252 4 weeks ago 1.23 GB
docker.io/brookshi/hitchhiker v0.10 ef0575e6ef11 4 weeks ago 1.23 GB
docker.io/ubuntu 15.10 9b9cb95443b5 21 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
docker.io/ubuntu 13.10 7f020f7bf345 3 years ago 185 MB
使用我们的新镜像 runoob/ubuntu
来启动一个容器
[root@VM_0_7_centos hitchhiker]# docker run -t -i runoob/ubuntu:v2 /bin/bash
root@ab5a15935316:/#
构建镜像
我们使用命令 docker build
, 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile
文件,其中包含一组指令来告诉 Docker
如何构建我们的镜像。
runoob@runoob:~$ cat Dockerfile 【我用的是vim Dockerfile】
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条 FROM
,指定使用哪个 镜像源
RUN
指令告诉 docker
在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile
文件,通过 docker build
命令来构建一个镜像。
[root@VM_0_7_centos thc_centos]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 2.048 kB
Step 1/9 : FROM centos:6.7
Trying to pull repository docker.io/library/centos ...
6.7: Pulling from docker.io/library/centos
cbddbc0189a0: Pull complete
Digest: sha256:b86f16d7a194c5c8777e61ab9e3b16b99ca4d813bad2d60bfc796b3272a81f28
Status: Downloaded newer image for docker.io/centos:6.7
---> 000c5746fa52
Step 2/9 : MAINTAINER Fisher "[email protected]"
---> Running in c9e1de831dd4
---> 6f0bee29af17
Removing intermediate container c9e1de831dd4
Step 3/9 : RUN /bin/echo 'root:123456' |chpasswd
---> Running in b6b880b9a47a
---> 9b4edf7fb8db
Removing intermediate container b6b880b9a47a
Step 4/9 : RUN useradd runoob
---> Running in 0a7995dad3f1
---> 4d2e48b4ebd7
Removing intermediate container 0a7995dad3f1
Step 5/9 : RUN /bin/echo 'runoob:123456' |chpasswd
---> Running in e77f07b9e24f
---> 2ebfb340d365
Removing intermediate container e77f07b9e24f
Step 6/9 : RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
---> Running in fccc927a063a
---> ff2afaa09964
Removing intermediate container fccc927a063a
Step 7/9 : EXPOSE 22
---> Running in debbde879624
---> 95c2e54679df
Removing intermediate container debbde879624
Step 8/9 : EXPOSE 80
---> Running in e159594226d3
---> cc959b4e6293
Removing intermediate container e159594226d3
Step 9/9 : CMD /usr/sbin/sshd -D
---> Running in 155b08becbc6
---> 796850755210
Removing intermediate container 155b08becbc6
Successfully built 796850755210
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile
文件所在目录,可以指定 Dockerfile
的绝对路径
使用 docker images
查看创建的镜像已经在列表中存在, 镜像ID
为 796850755210
[root@VM_0_7_centos thc_centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 796850755210 25 seconds ago 191 MB
runoob/ubuntu v2 4ddf6452c51c 45 minutes ago 137 MB
docker.io/nginx latest b175e7467d66 5 days ago 109 MB
docker.io/mysql 5.7 5195076672a7 4 weeks ago 371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn v0.10 62db6828e252 4 weeks ago 1.23 GB
docker.io/brookshi/hitchhiker v0.10 ef0575e6ef11 4 weeks ago 1.23 GB
docker.io/centos 6.7 000c5746fa52 5 months ago 191 MB
docker.io/ubuntu 15.10 9b9cb95443b5 21 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
docker.io/ubuntu 13.10 7f020f7bf345 3 years ago 185 MB
我们可以使用新的镜像来创建容器
[root@VM_0_7_centos thc_centos]# docker run -t -i runoob/centos:6.7 /bin/bash
[root@9bb9da37385f /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)
从上面看到新镜像已经包含我们创建的用户 runoob
设置镜像标签
我们可以使用 docker tag
命令,为镜像添加一个新的标签。
docker tag 796850755210 runoob/centos:dev
docker tag 镜像ID
,这里是 796850755210
, 用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images
命令可以看到,ID为 796850755210
的镜像多一个标签。
[root@VM_0_7_centos thc_centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
runoob/centos 6.7 796850755210 4 minutes ago 191 MB
runoob/centos dev 796850755210 4 minutes ago 191 MB
runoob/ubuntu v2 4ddf6452c51c 49 minutes ago 137 MB
docker.io/nginx latest b175e7467d66 5 days ago 109 MB
docker.io/mysql 5.7 5195076672a7 4 weeks ago 371 MB
registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn v0.10 62db6828e252 4 weeks ago 1.23 GB
docker.io/brookshi/hitchhiker v0.10 ef0575e6ef11 4 weeks ago 1.23 GB
docker.io/centos 6.7 000c5746fa52 5 months ago 191 MB
docker.io/ubuntu 15.10 9b9cb95443b5 21 months ago 137 MB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
docker.io/ubuntu 13.10 7f020f7bf345 3 years ago 185 MB
Docker 容器连接
前面我们实现了通过网络端口来访问运行在docker容器内的服务。下面我们来实现通过端口连接到一个docker容器
网络端口映射
我们创建了一个 python
应用的容器。
[root@VM_0_7_centos thc_centos]# docker run -d -P training/webapp python app.py
51e5d2b856934b6c05bed2550f80b614ba44763fd8975c334f85d51ee15c422b
另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1
。
我们使用 -P
参数创建一个容器,使用 docker ps
来看到端口 5000
绑定主机端口 1026
。
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51e5d2b85693 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:1026->5000/tcp musing_ride
ccc2e67c4f3d nginx "nginx -g 'daemon ..." 4 hours ago Up 4 hours 80/tcp goofy_hamilton
a1b4a3793088 registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10 "pm2-docker index.js" 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp hitchhiker
92e926a4c155 mysql:5.7 "docker-entrypoint..." 7 hours ago Up 5 hours 3306/tcp hitchhiker-mysql
我们也可以使用 -p
标识来指定容器端口绑定到主机端口。
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的高端口。
- -p : 是容器内部端口绑定到指定的主机端口。
[root@VM_0_7_centos thc_centos]# docker run -d -p 5000:5000 training/webapp python app.py
093c9f50b7f4043ad5ab26425aa1aa7a3947a76ab509723c8ffc3eafd13e8814
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
093c9f50b7f4 training/webapp "python app.py" 21 seconds ago Up 20 seconds 0.0.0.0:5000->5000/tcp dazzling_lichterman
51e5d2b85693 training/webapp "python app.py" 4 minutes ago Up 4 minutes 0.0.0.0:1026->5000/tcp musing_ride
ccc2e67c4f3d nginx "nginx -g 'daemon ..." 4 hours ago Up 4 hours 80/tcp goofy_hamilton
a1b4a3793088 registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10 "pm2-docker index.js" 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp hitchhiker
92e926a4c155 mysql:5.7 "docker-entrypoint..." 7 hours ago Up 5 hours 3306/tcp hitchhiker-mysql
另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。
[root@VM_0_7_centos thc_centos]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
f1c597ecfb6d3321398c67d550a3d05faa9a716dc7275e058743c0bb69726427
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1c597ecfb6d training/webapp "python app.py" 19 seconds ago Up 19 seconds 127.0.0.1:5001->5000/tcp priceless_shirley
093c9f50b7f4 training/webapp "python app.py" 7 minutes ago Up 7 minutes 0.0.0.0:5000->5000/tcp dazzling_lichterman
51e5d2b85693 training/webapp "python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:1026->5000/tcp musing_ride
ccc2e67c4f3d nginx "nginx -g 'daemon ..." 4 hours ago Up 4 hours 80/tcp goofy_hamilton
a1b4a3793088 registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10 "pm2-docker index.js" 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp hitchhiker
92e926a4c155 mysql:5.7 "docker-entrypoint..." 7 hours ago Up 5 hours 3306/tcp hitchhiker-mysql
这样我们就可以通过访问 127.0.0.1:5001
来访问容器的 5000
端口。
上面的例子中,默认都是绑定 tcp
端口,如果要绑定 UDP
端口,可以在端口后面加上 /udp
。
[root@VM_0_7_centos thc_centos]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
a70b1bd118fea81bad26e749e99ba00c72d17499711e2a6490a22bfb26ec7259
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a70b1bd118fe training/webapp "python app.py" 6 seconds ago Up 5 seconds 5000/tcp, 127.0.0.1:5000->5000/udp epic_borg
f1c597ecfb6d training/webapp "python app.py" About a minute ago Up About a minute 127.0.0.1:5001->5000/tcp priceless_shirley
093c9f50b7f4 training/webapp "python app.py" 9 minutes ago Up 9 minutes 0.0.0.0:5000->5000/tcp dazzling_lichterman
51e5d2b85693 training/webapp "python app.py" 13 minutes ago Up 13 minutes 0.0.0.0:1026->5000/tcp musing_ride
ccc2e67c4f3d nginx "nginx -g 'daemon ..." 4 hours ago Up 4 hours 80/tcp goofy_hamilton
a1b4a3793088 registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10 "pm2-docker index.js" 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp hitchhiker
92e926a4c155 mysql:5.7 "docker-entrypoint..." 7 hours ago Up 5 hours 3306/tcp hitchhiker-mysql
[root@VM_0_7_centos thc_centos]#
docker port
命令可以让我们快捷地查看端口的绑定情况。
[root@VM_0_7_centos thc_centos]# docker port f1c597ecfb6d 5000【容器端口(不是本机端口)】
127.0.0.1:5001
Docker容器连接
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用 --name
标识来命名容器,例如:
[root@VM_0_7_centos thc_centos]# docker run -d -P --name runoob training/webapp python app.py
86e39f43ad910866e62e4964ae97171ff691818b0e07bb58600569aec9a6e03e
[root@VM_0_7_centos thc_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86e39f43ad91 training/webapp "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:1027->5000/tcp runoob
a70b1bd118fe training/webapp "python app.py" 3 minutes ago Up 3 minutes 5000/tcp, 127.0.0.1:5000->5000/udp epic_borg
f1c597ecfb6d training/webapp "python app.py" 5 minutes ago Up 5 minutes 127.0.0.1:5001->5000/tcp priceless_shirley
093c9f50b7f4 training/webapp "python app.py" 12 minutes ago Up 12 minutes 0.0.0.0:5000->5000/tcp dazzling_lichterman
51e5d2b85693 training/webapp "python app.py" 16 minutes ago Up 16 minutes 0.0.0.0:1026->5000/tcp musing_ride
ccc2e67c4f3d nginx "nginx -g 'daemon ..." 4 hours ago Up 4 hours 80/tcp goofy_hamilton
a1b4a3793088 registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10 "pm2-docker index.js" 5 hours ago Up 5 hours 0.0.0.0:8080->8080/tcp, 0.0.0.0:11010->11010/tcp hitchhiker
92e926a4c155 mysql:5.7 "docker-entrypoint..." 7 hours ago Up 5 hours 3306/tcp hitchhiker-mysql