目录
- 1. 系统相关
- 2. Docker仓库相关
- 3. Docker常用操作
- 3.1.
docker images
查看本地镜像 - 3.2.
docker search
搜索镜像 - 3.3.
docker pull
拉取镜像 - 3.4.
docker run
运行镜像 - 3.5.
docker ps
查看正在运行的容器 - 3.6.
docker exec
进入正在运行的容器 - 3.7.
docker attach
附到正在运行的容器(attach) - 3.8.
docker top
查看容器运行的进程 - 3.9.
docker stop
停止/退出容器 - 3.10.
docker start
启动容器 - 3.11.
docker restart
重启容器 - 3.12.
docker rm
删除容器 - 3.13.
docker commit
提交容器 - 3.14.
docker push
上传提交的容器/镜像 - 3.15.
docker info
查看docker系统配置信息 - 3.16.
docker help
帮助信息 - 3.17.
docker volume
数据卷管理
- 3.1.
- 4. 其它
1 系统相关
$cat /etc/issue Ubuntu 18.04.1 LTS \n \l
1.2 用户组配置
$gpasswd -a miracle docker $systemctl docker restart $pkill X
注:如果不进行如上的用户组配置,那么执行 docker images
的时候就会出现权限的错误。
如下命令同样适用
$sudo systemctl start docker $sudo systemctl enable docker $sudo systemctl restart docker #修改配置文件之后,重启docker服务 $systemctl daemon-reload $systemctl restart docker.service
注:发现重启之后,已运行的docker容器也退出了。
1.3 Docker版本
查看 docker
版本的命令:
$docker -v
2 Docker仓库相关
Docker仓库的理解参考: 关于Docker仓库
2.1 docker search
搜索镜像
$docker search busybox
搜索包含 busybox 的镜像,会有很多,比如
miracle@xmnb4003210:~/misc$ docker search busybox NAME DESCRIPTION STARS OFFICIAL AUTOMATED busybox Busybox base image. 1634 [OK] progrium/busybox 70 [OK] radial/busyboxplus Full-chain, Internet enabled, busybox made f… 24 [OK] arm32v7/busybox Busybox base image. 7 yauritux/busybox-curl Busybox with CURL 5 armhf/busybox Busybox base image. 4 arm64v8/busybox Busybox base image. 3 ......
2.2 docker pull
下载镜像
$docker pull busybox
不指定版本号会默认下载 busy:latest
,结果类似如下:
$ docker pull busybox Using default tag: latest latest: Pulling from library/busybox ee153a04d683: Pull complete Digest: sha256:e3b586a669fae4073bb68b5bcabea26dae469ee6f157050c212c77b50f992d5a Status: Downloaded newer image for busybox:latest
镜像下载中可以看到是分层下载,每一层都有一个唯一的ID值表示,每层下载的大小实际为该层进行的修改增量。
2.3 docker login
登录
$docker login --username=vaqeteart Password: WARNING! Your password will be stored unencrypted in /home/miracle/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
只有登录之后,才能使用 docker push
推送提交的镜像到仓库。使用 docker login
命令直接登陆到 docker hub
, 登陆信息均会保存在 $HOME/.docker/config.json
目录下
2.4 docker logout
退出
$docker logout Removing login credentials for https://index.docker.io/v1/
3 Docker常用操作
3.1 docker images
查看本地镜像
$docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 d131e0fa2585 10 days ago 102MB ubuntu latest d131e0fa2585 10 days ago 102MB
3.2 docker search
搜索镜像
$ docker search busybox NAME DESCRIPTION STARS OFFICIAL AUTOMATED busybox Busybox base image. 1637 [OK] progrium/busybox 70 [OK] radial/busyboxplus Full-chain, Internet enabled, busybox made f… 24 [OK] arm32v7/busybox Busybox base image. 7 yauritux/busybox-curl Busybox with CURL 5 ......
这会搜索所有dockerhub上的镜像。
3.3 docker pull
拉取镜像
$docker pull busybox
这会将相应名称的镜像拉取(下载)到本地,拉取之后,便可以运行镜像了。
其它可能的命令类似:
$docker pull ubuntu:latest 或 $docker pull ubuntu:18.04 #或 $docker pull registry.hub.docker.com/ubuntu:latest
3.4 docker run
运行镜像
$docker run -it ubuntu:18.04 /bin/bash root@7b74c9092147:/#
这样就由镜像的运行生成了一个容器,并进入到容器中了。发现,很多命令比如 ifconfig
等都没有。但是可以运行 apt-get install update
。
3.5 docker ps
查看正在运行的容器
$docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b74c9092147 ubuntu:18.04 "/bin/bash" 3 minutes ago Up 3 minutes angry_spence
注意,使用 docker ps -a
可查看所有状态的容器。
3.6 docker exec
进入正在运行的容器
$docker exec -it 7b74c9092147 /bin/bash
这样和使用ssh登录一样,使用 C-D
退出之后也不会导致整个容器退出(注意,这个容器事先必须是已经处于运行的状态),
使用 docker top <容器id>
可以看到,执行exec之后,新多了一个bash进程。
使用exec命令进入容器内部就如同进入另一个机器一样,并且使用exit命令,不会像attach那样导致容器停止,所以非常适合容器内部操作
3.7 docker attach
附到正在运行的容器(attach)
$docker attach 7b74c9092147
这样会进入到相应的容器中,如同exec登录一样,但是如果通过 C-d
退出容器的时候,会发现,原来用 docker run -it
/ docker exec -it
运行的容器也被退出了,并且 docker ps
会发现没有正在运行的容器了,而 docker ps -a
可以看到容器的状态是Exited(130)。退出的方式应该是: C-p C-q
中文意思是附加、贴上、系上等意思,所以dokcer attach主要的作用就是进入容器,这个容器和后面的docker exec类似但是完全不一样。 使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虚拟终端,此时容器还在运行。 官方不推荐使用docker attach命令进入开启了交互模式的容器,docker attach的主要功能是查看信息,容器内部操作有更加方便的docker exec命令,将在稍后介绍。
3.8 docker top
查看容器运行的进程
$docker top 7b74c9092147 UID PID PPID C STIME TTY TIME CMD root 7726 7700 0 16:44 pts/0 00:00:00 /bin/bash root 8079 7700 0 16:48 pts/1 00:00:00 /bin/bash
3.9 docker stop
停止/退出容器
$docker stop 7b74c9092147
这样会停止容器,同时通过 exec
等进入容器的终端也会退出,使用 docker ps -a
可以看到停止的状态是 Exit(0), 和 docker attach
通过 C-d
或重启机器之后看到的状态Exit(130)类似。
实践发现,对于容器中发现如下三种方式退出后,容器仍为Up或者被停止的情况视 exec
还是 attach
有所不同。
- 运行
exit
命令 exec -it
进入、或run -it
启动的,只是退出登录,容器仍然运行;attach
附加的会导致容器停止。- 运行
C-p C-q
exec -it
进入、或run -it
启动的、或attach
附加的,只是退出登录,容器仍然运行。- 运行
C-d
exec -it
进入、或run -it
启动的,只是退出登录,容器仍然运行;attach
附加的会导致容器停止。
3.10 docker start
启动容器
$docker start 7b74c9092147
这样会将 docker ps -a
看到的状态为Exit状态的容器重启起来。
3.11 docker restart
重启容器
$docker restart 7b74c9092147
这样会重启容器,相当于 stop
再 start
, 同时通过 exec
等进入容器的终端也会退出。
3.12 docker rm
删除容器
$docker rm 7b74c9092147
执行之后,将会在 docker ps -a
中看到相应的容器已经消失。
3.13 docker commit
提交容器
可以提交容器,来创建相应的镜像,保存事先操作的环境。
root@71fe2a8636b9:/#exit $ docker commit -m 'ubuntu with ifconfig/sudo/miracle' -a "vaqeteart" 71fe2a8636b9 vaqeteart/ubuntu:test1 sha256:c2fd07bf051627a437da9a963ad4d06990b7b0e134f2f7e4e3936ad11474d832
注意,先退出容器(71fe2a8636b9)。
其中, -m
指定说明信息; -a
指定用户信息; 71fe2a8636b9
代表容器的id; vaqeteart/ubuntu:vim
指定目标镜像的用户名、仓库名和 tag
信息,运行命令的时候使用自己注册Docker时的用户名。
此时Docker中就有了我们新建的镜像 vaqeteart/ubuntu:test1
,此镜像和原有的 ubuntu
镜像区别在于多了一些工具。此时我们利用新镜像创建的容器,本身就自带之前提交容器相关的工具了。
可看到相关的镜像
miracle@xmnb4003210:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE vaqeteart/ubuntu test1 c2fd07bf0516 5 minutes ago 132MB busybox latest db8ee88ad75f 3 months ago 1.22MB ubuntu 18.04 d131e0fa2585 5 months ago 102MB ubuntu latest d131e0fa2585 5 months ago 102MB
3.14 docker push
上传提交的容器/镜像
$docker push vaqeteart/ubuntu:test1 The push refers to repository [docker.io/vaqeteart/ubuntu] 1b0fea03824f: Pushed 7660ded5319c: Mounted from library/ubuntu 94e5c4ea5da6: Mounted from library/ubuntu 5d74a98c48bc: Mounted from library/ubuntu 604cbde1a4c8: Mounted from library/ubuntu test1: digest: sha256:b44733a335979077d46237d826a267176ea9cf1e5e80c1b5914a6277662d2b7b size: 1362
注意,只有事先使用 docker login
登录之后,才能够使用 docker push
推送镜像,没有登录的话,会出现如下失败:
$docker push vaqeteart/ubuntu:test1 The push refers to repository [docker.io/vaqeteart/ubuntu] 1b0fea03824f: Preparing 7660ded5319c: Preparing 94e5c4ea5da6: Preparing 5d74a98c48bc: Preparing 604cbde1a4c8: Preparing denied: requested access to the resource is denied
3.14.1 其它参考
源自:https://www.oschina.net/question/877522_239204
无敌菌君 2015/09/06 15:41 step1——找到本地镜像的ID:docker images step2——登陆Hub:docker login --username=username --password=password --email=email step3——tag:docker tag <imageID> <namespace>/<image name>:<version tag eg latest> step4——push镜像:docker push <namespace>/<image name> ...... Yashin 2015/06/12 13:07 额,这个看一下文档就行了啊,好简单的,碰到具体问题再来提问比较好 https://docs.docker.com/docker-hub/ 评论 (0) 引用此答案 举报 0 ...... xue777hua xue777hua 2015/09/05 13:36 1. 建立一个private的 registry 2. 制作一个image:可以dockerfile,也可以docker commit 3. docker push 即可
3.15 docker info
查看docker系统配置信息
$docker info Containers: 5 Running: 1 Paused: 0 Stopped: 4 Images: 3 Server Version: 18.09.7 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: runc version: N/A init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662) Security Options: apparmor seccomp Profile: default Kernel Version: 4.15.0-43-generic Operating System: Ubuntu 18.04.1 LTS OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 7.343GiB Name: xmnb4003210 ID: DPEZ:7TCA:W5LW:QFSM:PU7X:5SC6:KXU5:SN4A:VTAS:HBTZ:ZUUJ:EO6D Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No swap limit support
3.16 docker help
帮助信息
查看整体帮助信息:
$docker help
查看具体命令帮助信息:
docker <command> --help 或 docker help <command>
3.17 docker volume
数据卷管理
管理数据卷使用 docker volume
命令,数据卷是容器数据持久化的一个组件。其中:
docker volume ls
:可以查看本机的全部数据卷docker volume rm
:删除不需要的数据卷(数据卷与容器的生命周期完全独立,所以容器删除后数据卷并不会删除,时间久了数据卷就会越来越多)docker volume inspect
:查看数据卷的详细信息docker volume create
:创建一个数据卷docker volume prune
:删除所有未使用的卷
3.17.1 REFERENCE 启动镜像并且创建匿名Volume
$docker run --name test_volume -it -v /home/miracle/mydata d131e0fa2585 /bin/bash
Volume用于容器/主机数据的管理、共享、与传输等。这里,不能用 docker exec
来进入已有的容器,只能从镜像启动时指定。启动之后,你会发现容器中有 /home/miracle/mydata
这个目录。这里,使用 --name
指定生成的容器名称为 test_volume
, 便于后续查看管理。
3.17.1.1 检查挂载的volume在host主机中的路径
$docker inspect test_volume ..... "Mounts": [ { "Type": "volume", "Name": "3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90", "Source": "/var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data", "Destination": "/home/miracle/mydata", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], ......
由上可见,容器中的 /home/miracle/mydata
其实是对应了主机中的 /var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data
的,实际操作中,在容器中,或者在主机中进行对该目录的操作(添加删除文件),在容器和主机的对应路径中都会体现出来。
3.17.2 REFERENCE 创建有名Volume并在启动镜像时挂载到容器中
$docker volume create test_volume2 test_volume2 $sudo ls /var/lib/docker/volumes [sudo] miracle 的密码: 0b66e301bdab3edcab10ba390aa522dedd5b2dedbf49273f0ca0aa33c71d59bf metadata.db 3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90 test_volume2 $docker run --name test_volume2 -it -v test_volume2:/home/miracle/volume2 d131e0fa2585 /bin/bash $docker inspect test_volume2 ...... "Mounts": [ { "Type": "volume", "Name": "test_volume2", "Source": "/var/lib/docker/volumes/test_volume2/_data", "Destination": "/home/miracle/volume2", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ......
这里,首先使用 docker volume create
创建一个 test_volume2
的volume,然后通过 docker run
将其挂载到容器的 /home/miracle/volume2
目录中,启动之后,我们可以发现,在容器中的 /home/miracle/volume2
对应挂载了主机中的 /var/lib/docker/volumes/test_volume2/_data
3.17.3 REFERENCE 启动镜像的时候将主机中一个目录挂载到容器中
$docker run --name test_mount -it -v /home/miracle/tmpTrans:/home/miracle/tmpTrans d131e0fa2585 /bin/bash
这里, /home/miracle/tmpTrans:/home/miracle/tmpTrans
冒号前面是主机的路径,冒号后面是容器的路径。这样执行之后,你会发现,容器中会创建相应的路径,并将主机中相应的路径挂载进来。
注:使用 docker exec -v xxx
是不行的。主机的路径名一定要是绝对路径或者 ~/xxx
否则会被当成volume挂载。这个方式依赖主机的目录结构,所以可以移植性不如前面volume的方式。
4 其它
更多学习参考: Docker实践
4.1 实践尝试
4.1.1 重启宿主机之后容器停止,重新启动容器数据仍在
使用 docker exec -it <id> /bin/bash
进入容器之后,再 C-d
退出,发现 docker ps
容器仍旧在运行。
docker ps
发现有运行的容器之后,重启机器,会发现 docker ps
没有运行的容器了,但是 docker ps -a
会有Exit的容器。
重启机器后, docker start <id>
会启动之前的容器,并且使用 docker exec -it <id> /bin/bash
会发现之前创建的文件仍在。