Docker基础使用 | 点点开发技术分享 (diandian100.cn)

 

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.04DebianCentOS6 、CentOS7FedoraArch 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

发表评论

邮箱地址不会被公开。 必填项已用*标注