Docker基础使用

Docker 是一个开源项目最初是 DotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker是一个轻量级、便携式与外界隔离的容器,也是一个可以在容器中很方便地构建、传输、运行应用的引擎。这里简单记录下一些Docker常用命令的使用。

Docker镜像加速器

Linux

1
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04DebianCentOS6CentOS7FedoraArch LinuxopenSUSE Leap 42.1,其他版本可能有细微不同。更多详情请访问文档。

macOS

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中加入下面的镜像地址:

1
http://f1361db2.m.daocloud.io

点击 Apply & Restart 按钮使设置生效。

Docker Toolbox 等配置方法请参考帮助文档

Windows

在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把下面的地址:

1
http://f1361db2.m.daocloud.io

加到” registry-mirrors“的数组里。点击 Apply

手动添加镜像源

NOTE:若以上命令不可用,可以自行添加镜像源,方法如下:

创建配置文件

1
2
# 创建配置文件
touch /etc/docker/daemon.json

写入内容

1
2
3
{
"registry-mirrors":["http://f1361db2.m.daocloud.io"]
}

重启docker服务

1
sudo systemctl restart docker

Docker基础命令解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
[root@docker ~]# docker --help

Usage:
docker [OPTIONS] COMMAND [arg...]

docker daemon [ --help | ... ]

docker [ --help | -v | --version ]



A
self-sufficient runtime for containers.



Options:



--config=~/.docker Location of client config files #客户端配置文件的位置

-D, --debug=false Enable debug mode #启用Debug调试模式

-H, --host=[] Daemon socket(s) to connect to #守护进程的套接字(Socket)连接

-h, --help=false Print usage #打印使用

-l, --log-level=info Set the logging level #设置日志级别

--tls=false Use TLS; implied by--tlsverify #

--tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任证书签名CA

--tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS证书文件路径

--tlskey=~/.docker/key.pem Path to TLS key file #TLS密钥文件路径

--tlsverify=false Use TLS and verify the remote #使用TLS验证远程

-v, --version=false Print version information and quit #打印版本信息并退出



Commands:

attach Attach to a running container #当前shell下attach连接指定运行镜像

build Build an image from a Dockerfile #通过Dockerfile定制镜像

commit Create a new image from a container's changes #提交当前容器为新的镜像

cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中

create Create a new container #创建一个新的容器,同run 但不启动容器

diff Inspect changes on a container's filesystem #查看docker容器变化

events Get real time events from the server#从docker服务获取容器实时事件

exec Run a command in a running container#在已存在的容器上运行命令

export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)

history Show the history of an image #展示一个镜像形成历史

images List images #列出系统当前镜像

import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)

info Display system-wide information #显示系统相关信息

inspect Return low-level information on a container or image #查看容器详细信息

kill Kill a running container #kill指定docker容器

load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)

login Register or log in to a Docker registry#注册或者登陆一个docker源服务器

logout Log out from a Docker registry #从当前Docker registry退出

logs Fetch the logs of a container #输出当前容器日志信息

pause Pause all processes within a container#暂停容器

port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口

ps List containers #列出容器列表

pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像

push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器

rename Rename a container #重命名容器

restart Restart a running container #重启运行的容器

rm Remove one or more containers #移除一个或者多个容器

rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)

run Run a command in a new container #创建一个新的容器并运行一个命令

save Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)

search Search the Docker Hub for images #在docker
hub中搜索镜像

start Start one or more stopped containers#启动容器

stats Display a live stream of container(s) resource usage statistics #统计容器使用资源

stop Stop a running container #停止容器

tag Tag an image into a repository #给源中镜像打标签

top Display the running processes of a container #查看容器中运行的进程信息

unpause Unpause all processes within a container #取消暂停容器

version Show the Docker version information#查看容器版本号

wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值



Run 'docker COMMAND --help' for more information on a command. #运行docker命令在帮助可以获取更多信息

显示已有镜像

1
2
3
4
5
6
7
8
docker images
or
docker image ls
显示:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest a2a15febcdf3 3 weeks ago 64.2MB
hello-world latest fce289e99eb9 8 months ago 1.84kB

删除镜像

1
docker image rm 镜像名

搜索镜像

1
docker search 镜像名

获取下载docker镜像

1
docker pull 镜像名(镜像ID)

运行镜像

1
docker run 镜像名(镜像id前三位)

查看正在运行的docker镜像

1
2
3
4
5
6
# 查看正在运行的镜像(存活的)
docker ps
# 查看运行过的镜像记录(挂掉的)
docker ps -a
# 查看运行过的镜像记录仅显示记录id
docker ps -aq

删除镜像、镜像记录

1
2
3
4
# 删除镜像记录
docker rm 镜像记录id(前三位即可)
# 删除镜像
docker rmi 镜像id

批量删除镜像记录

1
2
# 批量删除所有镜像记录
docker rm `docker ps -aq`

导出docker镜像

导出命令为docker save

查看当前已有镜像

1
2
3
root@Tony-PC:/tmp# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tonyu/flask-hello latest b7ac47e3f338 7 minutes ago 890MB

导出该镜像

1
root@Tony-PC:/tmp# docker save tonyu/flask-hello > /tmp/flask-centos.tar.gz

查看已导出镜像

1
2
3
root@Tony-PC:/tmp# ls -l
总用量 892504
-rw-r--r-- 1 root root 913905664 9月 17 10:20 flask-centos.tar.gz

导入docker镜像

我们先删除刚才的镜像和镜像记录tonyu/flask-hello,导入命令是docker load

导入镜像包

1
2
3
4
root@Tony-PC:/tmp# docker load < /tmp/flask-centos.tar.gz
4479b1829422: Loading layer [==================================================>] 5.14MB/5.14MB
2199fb161fda: Loading layer [==================================================>] 3.072kB/3.072kB
Loaded image: tonyu/flask-hello:latest

查看是否导出成功

1
2
3
root@Tony-PC:/tmp# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tonyu/flask-hello latest b7ac47e3f338 14 minutes ago 890MB

交互式运行镜像

1
2
3
4
5
6
7
docker run -it --rm ubuntu bash
docker run:运行容器命令
参数:
-it: -i代表交互式操作;-t代表终端。
--rm:容器退出后将其删除。也可不指定参数,手动docker rm,使用--rm可以避免浪费空间。
ubuntu:指定的容器镜像
bash:指定用交互式的shell, 因此需要bash命令(可省略)

后台模式启动Docker镜像

1
2
3
4
5
6
# 每秒打印一次hello centos
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
# 查看正在运行的docker镜像
root@Tony-PC:/home/tony# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61b09f32454c centos "/bin/sh -c 'while t…" 5 seconds ago Up 5 seconds strange_hodgkin

查看容器内的标准输出日志

1
2
3
4
5
6
7
8
9
10
11
12
# 查看容器内的标准输出
root@Tony-PC:/home/tony# docker logs 61b
hello centos
hello centos
hello centos
hello centos
# 查看容器内的标准输出(实时监测,类似tail)
root@Tony-PC:/home/tony# docker logs 61b -f
hello centos
hello centos
hello centos
hello centos

终止正在运行的docker镜像

1
2
root@Tony-PC:/home/tony# docker stop 61b
61b

重新运行记录中的docker镜像

1
root@Tony-PC:/home/tony# docker start 61b

提交创建自定义的镜像

我们发现当我们运行镜像在镜像中安装了自定义的软件,退出后重新进入该镜像,之前安装的软件都不存在了,这就需要我们提交下自己的镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 交互式运行centos镜像
docker run -it centos
# 安装vim
yum install vim -y
# 退出centos镜像
exit
# 查看docker镜像运行记录
root@Tony-PC:/home/tony# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d684e9735d15 centos "/bin/bash" 7 minutes ago Exited (0) 35 seconds ago loving_villa
ni
# 提交运行容器镜像为新的自定义镜像
docker commit d68 centos-vim
# 查看docker镜像
root@Tony-PC:/home/tony# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
contos-vim latest e90556adf335 16 seconds ago 369MB
# 运行镜像
root@Tony-PC:/home/tony# docker run -it e90
# 测试vim
[root@743b1e0c3e11 /]# vim

外部访问容器

期望:一个外部能访问的flask程序

进入centos镜像

1
docker run -it centos

安装python工具包

1
yum install python-setuptools

安装flask

1
[root@47830fd38e99 /]# easy_install flask

创建flask文件

1
2
3
4
[root@47830fd38e99 /]# cd /home
[root@47830fd38e99 home]# ls
[root@47830fd38e99 home]# touch flask-web.py
[root@47830fd38e99 home]# vim flask-web.py

写入代码

1
2
3
4
5
6
7
8
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
return '<h1>Im flask, im from Centos Docker</h1>'
if __name__=='__main__':
app.run(host='0.0.0.0', port=9000)

退出镜像

1
[root@47830fd38e99 home]# exit

查看镜像运行记录

1
2
3
4
root@Tony-PC:/home/tony# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47830fd38e99 centos "/bin/bash" 22 minutes ago Exited (0) 3 seconds ago jolly_prosk
uriakova

提交自定义镜像

1
2
3
root@Tony-PC:/home/tony# docker commit 478 flask-contos
sha256:9d07a47feca87a97ecff59f2b58c369051af25ef343813e0f1a0cf326bb88721

查看镜像列表

1
2
3
4
root@Tony-PC:/home/tony# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flask-contos latest 9d07a47feca8 8 seconds ago 374MB

运行镜像

1
2
3
root@Tony-PC:/home/tony# docker run -d -p 7000:9000  9d0 python /home/flask-web.py
f53e673da36d942becdc8bf9199dcbe608569511f102904e084d5b92c4d5aaab

查看当前正在运行的镜像和端口映射

1
2
3
4
5
6
root@Tony-PC:/home/tony# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f53e673da36d 9d0 "python /home/flask-…" 6 seconds ago Up 5 seconds 0.0.0.0:7000->9000/tcp gracious_euclid
root@Tony-PC:/home/tony# docker port f53
9000/tcp -> 0.0.0.0:7000

测试访问

发布容器镜像到仓库

注册dockerhub

https://hub.docker.com/ 注册用户

登录docker

1
2
3
4
5
6
7
8
9
10
root@Tony-PC:/home/tony# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one
.Username: 646547989
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

修改镜像名

1
2
3
4
# 提交格式
docker push 注册用户名/镜像名
# 修改提交镜像格式
root@Tony-PC:/home/tony# docker tag flask-contos 646547989/flask-centos

查看修改后的镜像

1
2
3
4
5
root@Tony-PC:/home/tony# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
646547989/flask-centos latest 9d07a47feca8 3 days ago 374MB
flask-contos latest 9d07a47feca8 3 days ago 374MB

推送镜像

1
2
3
4
5
6
root@Tony-PC:/home/tony# docker push 646547989/flask-centos
The push refers to repository [docker.io/646547989/flask-centos]
630f3a7bfad7: Pushed
877b494a9f30: Mounted from library/centos
latest: digest: sha256:c81d9d2d6d595c912c5ed6215e1c2e7da14518a141ae19f226eaaa146bd68d94 size: 741

查看推送的镜像

常见问题

某些镜像无法删除

有些镜像删除的时候会提示类似:“image has dependent child images”,大概意思是镜像有依赖,即有其他 image FROM 了这个 image,可以使用下面的命令列出所有在指定 image 之后创建的 image 的父 image

网上有些说先查询其依赖,再依次删除。

1
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=XXX) # XXX指镜像ID

实际情况下我们可能只有两三个镜像删除不掉,我们删除时加一个--force即可

1
docker rmi 镜像id(前三位即可) --force