$ sudo docker
Commands:
attach Attach to a running container
--将终端依附到容器上
1> 运行一个交互型容器
[root@localhost ~]# docker run -i -t centos /bin/bash
[root@f0a02b473067 /]#
2> 在另一个窗口上查看该容器的状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4a75f165ce6 centos "/bin/bash" 5 seconds ago Up 5 seconds cranky_mahavira
3> 退出第一步中运行的容器
[root@d4a75f165ce6 /]# exit
exit
4> 查看该容器的状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4a75f165ce6 centos "/bin/bash" 2 minutes ago Exited (0) 23 seconds ago cranky_mahavira
可见此时容器的状态是Exited,那么,如何再次运行这个容器呢?可以使用docker start命令
5> 再次运行该容器
[root@localhost ~]# docker start cranky_mahavira
cranky_mahavira
6> 再次查看该容器的状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4a75f165ce6 centos "/bin/bash" 6 minutes ago Up 29 seconds cranky_mahavira
因为该容器是交互型的,但此刻我们发现没有具体的终端可以与之交互,这时可使用attach命令。
7> 通过attach命令进行交互
[root@localhost ~]# docker attach cranky_mahavira
[root@d4a75f165ce6 /]#
build Build an image from a Dockerfile
--通过Dockerfile创建镜像
commit Create a new image from a container's changes
--通过容器创建本地镜像
注意:如果是要push到docker hub中,注意生成镜像的命名
[root@localhost ~]# docker commit centos_v1 centos:v1
68ad49c999496cff25fdda58f0521530a143d3884e61bce7ada09bdc22337638
[root@localhost ~]# docker push centos:v1
You cannot push a "root" repository. Please rename your repository to <user>/<repo> (ex: <user>/centos)
用centos:v1就不行,因为它push到docker hub中时,是推送到相应用户下,必须指定用户名。譬如我的用户名是ivictor,则新生成的本地镜像命名为:
docker push victor/centos:v1,其中v1是tag,可不写,默认是latest
cp Copy files/folders from a container to a HOSTDIR or to STDOUT
--在宿主机和容器之间相互COPY文件
cp的用法如下:
Usage: docker cp [OPTIONS] CONTAINER:PATH LOCALPATH|-
docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
如:容器mysql中/usr/local/bin/存在docker-entrypoint.sh文件,可如下方式copy到宿主机
# docker cp mysql:/usr/local/bin/docker-entrypoint.sh /root
修改完毕后,将该文件重新copy回容器
# docker cp /root/docker-entrypoint.sh mysql:/usr/local/bin/
create Create a new container
--创建一个新的容器,注意,此时,容器的status只是Created
diff Inspect changes on a container's filesystem
--查看容器内发生改变的文件,以我的mysql容器为例
[root@localhost ~]# docker diff mysqldb
C /root
A /root/.bash_history
A /test1.txt
A /test.tar
A /test.txt
C /run
C /run/mysqld
A /run/mysqld/mysqld.pid
A /run/mysqld/mysqld.sock
不难看出,C对应的均是目录,A对应的均是文件
events Get real time events from the server
--实时输出Docker服务器端的事件,包括容器的创建,启动,关闭等。
譬如:
[root@localhost ~]# docker events
2015-09-08T17:40:13.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) create
2015-09-08T17:40:14.000000000+08:00 d2a2ef5ddb90b505acaf6b59ab43eecf7eddbd3e71f36572436c34dc0763db79: (from wordpress) die
2015-09-08T17:42:10.000000000+08:00 839866a338db6dd626fa8eabeef53a839e4d2e2eb16ebd89679aa722c4caa5f7: (from mysql) start
exec Run a command in a running container
--用于容器启动之后,执行其它的任务
通过exec命令可以创建两种任务:后台型任务和交互型任务
后台型任务:docker exec -d cc touch 123 其中cc是容器名
交互型任务:
[root@localhost ~]# docker exec -i -t cc /bin/bash
root@1e5bb46d801b:/# ls
123 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
export Export a container's filesystem as a tar archive
--将容器的文件系统打包成tar文件
有两种方式(mysqldb为容器名):
docker export -o mysqldb1.tar mysqldb
docker export mysqldb > mysqldb.tar
history Show the history of an image
--显示镜像制作的过程,相当于dockfile
images List images
--列出本机的所有镜像
import Import the contents from a tarball to create a filesystem image
--根据tar文件的内容新建一个镜像,与之前的export命令相对应
[root@localhost ~]# docker import mysqldb.tar mysql:v1
eb81de183cd94fd6f0231de4ff29969db822afd3a25841d2dc9cf3562d135a10
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mysql v1 eb81de183cd9 21 seconds ago 281.9 MB
譬如下面一例:
[root@localhost volume2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cb07559cc17 docker.io/ubuntu "/bin/bash" 22 hours ago Up 22 hours naughty_bartik
[root@localhost volume2]# docker export gigantic_goldwasser > wanghui.tar
[root@localhost volume2]# docker import wanghui.tar wanghui:v1
sha256:b6cbbaf69a58149f337dcc439a21ed185dcdf96fd7f72ddf45e102d27f47c4ae
[root@localhost volume2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wanghui v1 b6cbbaf69a58 5 seconds ago 450.9 MB
[root@localhost volume2]# docker run -i -t wanghui:v1 /bin/bash
[root@78f4ac39972d /]# ps -ef
info Display system-wide information
--查看docker的系统信息
[root@localhost ~]# docker info
Containers: 3 --当前有3个容器
Images: 298
Storage Driver: devicemapper
Pool Name: docker-253:0-34402623-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 8.677 GB --对应的是下面Data loop file大小
Data Space Total: 107.4 GB
Data Space Available: 5.737 GB
Metadata Space Used: 13.4 MB --对应的是下面Metadata loop file大小
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.134 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-229.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 2
Total Memory: 979.7 MiB
Name: localhost.localdomain
ID: TFVB:BXGQ:VVOC:K2DJ:LECE:2HNK:23B2:LEVF:P3IQ:L7D5:NG2V:UKNL
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
inspect Return low-level information on a container or image
--用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
kill Kill a running container
--强制终止容器
关于stop和kill的区别,docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,
容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
load Load an image from a tar archive or STDIN
--与下面的save命令相对应,将下面sava命令打包的镜像通过load命令导入
login Register or log in to a Docker registry
--登录到自己的Docker register,需有Docker Hub的注册账号
[root@localhost ~]# docker login
Username: ivictor
Password:
Email: xxxx@foxmail.com
WARNING: login credentials saved in /root/.docker/config.json
Login Succeeded
logout Log out from a Docker registry
--退出登录
[root@localhost ~]# docker logout
Remove login credentials for https://index.docker.io/v1/
logs Fetch the logs of a container
--用于查看容器的日志,它将输出到标准输出的数据作为日志输出到docker logs命令的终端上。常用于后台型容器
pause Pause all processes within a container
--暂停容器内的所有进程,
此时,通过docker stats可以观察到此时的资源使用情况是固定不变的,
通过docker logs -f也观察不到日志的进一步输出。
port List port mappings or a specific mapping for the CONTAINER
--输出容器端口与宿主机端口的映射情况
譬如:
[root@localhost ~]# docker port blog
80/tcp -> 0.0.0.0:80
容器blog的内部端口80映射到宿主机的80端口,这样可通过宿主机的80端口查看容器blog提供的服务
ps List containers
--列出所有容器,其中docker ps用于查看正在运行的容器,ps -a则用于查看所有容器。
pull Pull an image or a repository from a registry
--从docker hub中下载镜像
push Push an image or a repository to a registry
--将本地的镜像上传到docker hub中
前提是你要先用docker login登录上,不然会报以下错误
[root@localhost ~]# docker push ivictor/centos:v1
The push refers to a repository [docker.io/ivictor/centos] (len: 1)
unauthorized: access to the requested resource is not authorized
rename Rename a container
--更改容器的名字
restart Restart a running container
--重启容器
rm Remove one or more containers
--删除容器,注意,不可以删除一个运行中的容器,必须先用docker stop或docker kill使其停止。
当然可以强制删除,必须加-f参数
如果要一次性删除所有容器,可使用 docker rm -f `docker ps -a -q`,其中,-q指的是只列出容器的ID
rmi Remove one or more images
--删除镜像
run Run a command in a new container
--让创建的容器立刻进入运行状态,该命令等同于docker create创建容器后再使用docker start启动容器
save Save an image(s) to a tar archive
--将镜像打包,与上面的load命令相对应
譬如:
docker save -o nginx.tar nginx
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
--动态显示容器的资源消耗情况,包括:CPU、内存、网络I/O
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
--恢复容器内暂停的进程,与pause参数相对应
version Show the Docker version information
--查看docker的版本
wait Block until a container stops, then print its exit code
--捕捉容器停止时的退出码
执行此命令后,该命令会“hang”在当前终端,直到容器停止,此时,会打印出容器的退出码。
Docker option
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 |
|
Docker run指令
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 129 130 131 132 133 134 |
|
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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
|
注意一点:当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
1 2 3 4 5 6 7 |
|
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 |
|
列出当前所有正在运行的容器
1 2 3 4 5 |
|
查看容器的相关信息
# docker inspect CONTAINER_ID
显示容器IP地址和端口号,如果输出是空的说明没有配置IP地址(不同的Docker容器可以通过此IP地址互相访问)
# docker inspect --format='{{.NetworkSettings.IPAddress}}' CONTAINER_ID
保存对容器的修改
# docker commit -m "Added ssh from ubuntu14.04" -a "birdben" 6s56d43f627f3 birdben/ubuntu:v1
参数:
-m参数用来来指定提交的说明信息;
-a可以指定用户信息的;
6s56d43f627f3代表的时容器的id;
birdben/ubuntu:v1指定目标镜像的用户名、仓库名和 tag 信息。
限制docker容器日志文件的大小
启动容器时,可以通过参数设置日志文件的大小、日志文件的格式。
# docker run -it --log-opt max-size=10m --log-opt max-file=3 centos
构建一个容器
# docker build -t="birdben/ubuntu:v1" .
参数:
-t为构建的镜像制定一个标签,便于记忆/索引等
. 指定Dockerfile文件在当前目录下,也可以替换为一个具体的 Dockerfile 的路径。
在docker中运行ubuntu镜像
# docker run <相关参数> <镜像 ID> <初始命令>
守护模式启动
# docker run -it ubuntu:14.04
交互模式启动
# docker run -it ubuntu:14.04 /bin/bash
指定端口号启动
# docker run -p 80:80 birdben/ubuntu:v1
指定配置启动
# sudo docker run -d -p 10.211.55.4:9999:22 birdben/ubuntu:v1 '/usr/sbin/sshd' -D
参数:
-d:表示以“守护模式”执行,日志不会出现在输出终端上。
-i:表示以“交互模式”运行容器,-i 则让容器的标准输入保持打开
-t:表示容器启动后会进入其命令行,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>,-v 标记来创建一个数据卷并挂载到容器里。在一次 run 中多次使用可以挂载多个数据卷。
-p:表示宿主机与容器的端口映射,此时将容器内部的 22 端口映射为宿主机的 9999 端口,这样就向外界暴露了 9999 端口,可通过 Docker 网桥来访问容器内部的 22 端口了。
注意:
这里使用的是宿主机的 IP 地址:10.211.55.4,与对外暴露的端口号 9999,它映射容器内部的端口号 22。ssh外部需要访问:ssh root@10.211.55.4 -p 9999
不一定要使用“镜像 ID”,也可以使用“仓库名:标签名”
根据镜像启动容器的时候,如果镜像的TAG是latest,那么就直接跟镜像名就行了;如果TAG不是latest,那么镜像后面要跟上这个TAG标识。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
docker运行一个容器必须是基于镜像来进行的,一旦容器启动了,我们就可以登录到容器中,安装自己所需的软件或应用程序。
启动容器的命令中必须跟一个镜像,启动容器后执行的命令必须放在镜像后面,如下,/bin/bash必须放在镜像名称的后面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
注意:创建应用容器时,一般做端口映射,为了让外部能够访问这些容器里的应用。可以通过-P或-p参数来指定端口映射
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 |
|
start 启动容器(多个容器,后面就跟多个容器id)
# docker start 117843ade696117843ade696
stop 停止正在运行的容器(多个容器,后面就跟多个容器id)(在容器里面按ctrl+d组合键,也会退出当前容器)
# docker stop 117843ade696117843ade696
restart 重启容器(多个容器,后面就跟多个容器id)
# docker restart 117843ade696117843ade696
删除容器和镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
登录Docker Hub中心
# docker login
发布上传image(push)
# docker push birdben/ubuntu:v1
Docker本机和容器之间的文件拷贝:
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
镜像的存出和载入(可以将本机下载的镜像导出,然后将导出文件上传到别的机器上,在别的机器上进行镜像导入)
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 |
|
容器的导出和导入(可以依据导出的容器快照导入为镜像,在本地或将容器快照文件上传到别的机器上进行导入镜像操作都可以)
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 |
|
比如说我在A机器上有个nginx容器,现在要在B机器上启动一个一模一样的nginx容器(或者说将A机器上的nginx容器拿到B机器上),方法有下面两种:
1 2 |
|
在运行状态中的容器内再次启动新的进程(docker exec)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
-----------------------------------------------------------------------------------------------------------
一般来说,容器创建后的主机名都是随机生成的一串字符。DNS也是默认和宿主机一样的(/etc/resolv.conf)
容器创建后,登陆容器是无法修改主机名或DNS配置的,会报错说:需要root权限才能修改!
其实容器的主机名或DNS配置是可以在容器创建的时候手动指定的:
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 |
|
Docker容器登陆的方法:
具体参考:Docker容器学习梳理--容器登陆方法梳理(attach、exec、nsenter)
查看docker中对应容器的IP
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 |
|
docker inspect 命令:显示更底层的容器或image信息(docker inspect images_id/container_id 查看镜像或容器信息)
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 |
|
特别注意一个细节:
1 2 3 4 5 6 7 8 9 10 |
|
---------------------------------------------------无法删除状态为Dead的容器---------------------------------------------------
docker中有两个status为dead的容器,删除时报错如下:
Error response from daemon: Driver devicemapper failed to remove root filesystem 33ddd2513fc3cb732fa02e912be1927929d8d028abefa945d8a3984d700a4d74: Device is Busy
解决办法:
1)看容器进程是否已经杀掉。没有的话,可以手动杀死。
2)mount -l看是不是该容器的路径还在挂载状态。是的话,umount掉。
3)然后再次尝试docker rm container_id
尽量不要手动去移除dm和docker里面container的相关文件,以免造成垃圾数据。
4)尝试docker rm -f <container-id>,强制删除
这样可以删除掉docker daemon中的container信息(但是已经创建的dm还是ACTIVE的,所以还要再去把dm给删除了)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
---------------------------------------------------容器启动失败错误1---------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
---------------------------------------------------容器启动失败错误2---------------------------------------------------
1 2 3 4 5 |
|
---------------------------------------------------容器yum不能使用--------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 |
|
==============关于docker容器和镜像以及文件的几个转化关系==============
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
-------------------------------------基于centos7的docker容器出现的一个bug--------------------------------------
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 |
|