0这是一个操作 Docker 镜像的小技巧:
不冲突的情况下, Docker 可以使用 ID 的前面几个字符进行快速操作,例如:
命令 # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
920c0f3c240a 89dc7e6d0ac1:latest "ls /etc/" 15 minutes ago Exited (0) 15 minutes ago ecstatic_perlman
3f2a0b440abc 89dc7e6d0ac1:latest "ls /etc/fstab" 15 minutes ago Exited (0) 15 minutes ago tender_curie
64c55acd970e 89dc7e6d0ac1:latest "ls -l" 15 minutes ago Exited (0) 15 minutes ago sharp_lumiere
c34716ad8f72 busybox:latest "/bin/sh -c 'while t 19 hours ago Exited (0) 12 hours ago trusting_kowalevski
977be396faf6 busybox:latest "/bin/sh -c 'while t 19 hours ago Exited (137) 19 hours ago ecstatic_lovelace
9e553497cbed busybox:latest "/bin/sh -c 'while t 19 hours ago Exited (137) 19 hours ago lonely_fermi
c9093d4c7637 busybox:latest "/bin/sh -c 'while t 19 hours ago Exited (137) 19 hours ago gloomy_pike
3f81114c48c2 busybox:latest "/bin/echo Hello Doc 19 hours ago Exited (0) 19 hours ago determined_swartz
26c98d7a589d hello-world:latest "/hello" 20 hours ago Exited (0) 20 hours ago distracted_babbage
36c0b05dc414 hello-world:latest "/hello" 20 hours ago Exited (0) 20 hours ago admiring_carson
可以使用 docker rm 92
命令快速删除容器 920c0f3c240a
,但是无法使用 docker rm 3f
命令进行快速删除某个容器,因为有两个以 3f
开头的容器,你必须用 docker rm 3f2
或者 docker rm 3f8
指定删除其中一个。
1.检查 Docker 是否安装:
docker info
查看帮助 :docker help 或者
docker <command> --help
1. 检查一下本机有多少 Docker 镜像:docker images
命令 # docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
hello-world latest 91c95931e552 5 days ago 910 B
sudo docker images # 显示当前系统镜像,不包括过渡层镜像
$ sudo docker images -a # 显示当前系统所有镜像,包括过渡层镜像
$ sudo docker images ubuntu # 显示当前系统 docker ubuntu 库中的所有镜像
2.搜索镜像 并 下载镜像
docker search [-s] IMAGE 例子 docker search busybox
sudo docker search -s 100 ubuntu # 查找 star 数至少为 100 的镜像,找出只有官方镜像 start 数超过 100,默认不加 s 选项找出所有相关 ubuntu 镜像 NAME DESCRIPTION
docker pull
[OPTIONS] NAME[:TAG|@DIGEST]
例子1: # docker pull busybox
例子2 : docker pull daocloud.io/library/ubuntu:16.04
下载镜像名称其实由三部分组成:其中其中daocloud.io是注册服务器地址,默认是 registry.hub.docker.com;library 是用户名,默认就是libraray, ubuntu是仓库名,16.04是标签名,默认是latest,第一个busybox 全名该是 registry.hub.docker.com/library/busybox:latest
3 给镜像添加标签
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
[root@bogon ~]# docker tag daocloud.io/library/ubuntu:16.04 ubuntu:latest
4 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
# 按标签删除:多个标签,仅会删除当前标签,不会删除镜像
[root@bogon ~]# docker rmi ubuntu:latest
# 按ID删除:直接删除镜像
[root@bogon ~]# docker rmi 12543ced0f6f
选项:
-
-f, --force
强制删除镜像 -
--no-prune
不删除untagged parents
5 导出镜像
docker save [OPTIONS] IMAGE [IMAGE...]
[root@bogon ~]# docker save -o ubuntu_latest.tar ubuntu:latest
[root@bogon ~]# ls -l
-rw-r--r--. 1 root root 128086528 Jun 28 12:39 ubuntu_latest.tar
选项:
-
-o, --output
写入到文件
6 导入镜像
docker load --input ubuntu_latest.tar
# 或者
docker load < ubuntu_latest.tar
选项:
-
-i, --input
从压缩包载入镜像
docker push [OPTIONS] NAME[:TAG|@DIGEST]
选项:
-
--disable-content-trust=true
跳过镜像签名
sudo docker push 192.168.0.100:5000/ubuntu # 推送镜像库到私有源[可注册 docker 官方账户,推送到官方自有账户]
sudo docker push 192.168.0.100:5000/ubuntu:14.04 # 推送指定镜像到私有源
8获取 Docker 镜像的更改历史:
docker history <image-name>
9创建镜像 :build
在前面我们讲过 Dockerfile
,不过一直没有告诉大家怎么用自己的 Dockerfile
生成镜像文件。
那么现在也不算晚:使用 build 命令生成 image。
docker build [OPTIONS] PATH | URL | -
PATH / URL / - 这三个是必选选项,三选一。
OPTION 可以使用 docker build --help
进行查看,主要包括构建过程中的内存限制、CPU 限制、以及其他。有两个必须需要了解的 OPTION 选项:
-f
: 和make
一样,如果PATH
内找不到Dockerfile
,则docker build
必须要-f
参数指定Dockerfile
。-t
: 指定生成的镜像标签。例如:docker build -f Dockerfile -t tag .
,使用Dockerfile.bak
生成一个标签叫tag
的镜像文件。
另外,-
选项非常有意思:docker build -
,然后可以交互式地输入 Dockerfile,输入完毕后按 Ctrl+D 结束输入即可。
OPTION 一定要放在 PATH / URL / - 前面。
10 load & save :
使用 load 从 stdin 导入一个 tar 格式的镜像或者仓库,用 save 将 tar 镜像输出到 stdout。
docker save -o <output file> <image>或者docker save <image> > <output file>
docker load -i <file name>或者docker load < <file name>
这两个命令常用于多节点部署。
例如:
命令 # docker save -o a.tar suse
命令 # docker load -i a.tar
load import pull 的区别 ?save export push 的区别?
1 save 和export是 生成镜像的方式:
load 和save 操作的是镜像 ,import 和 export 操作的是容器,结果是 export 出的镜像文件 比 save 的文件 要少一些镜像层。commit 是生成镜像的命令可以指定用以上哪种方式生成。
2 pull push 是传输镜像的方式, 操作的也是镜像,做的只是上传下载。
stop 和 kill 的区别?
docker stop,支持“优雅退出”。先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。
docker kill,发送SIGKILL信号,应用程序直接退出
3容器操作:
docker create 容器名或者容器ID 创建容器
docker start [-i] 容器名 启动容器
docker run 容器名或者容器ID 运行容器,相当于docker create + docker start
docker attach 容器名或者容器ID 进入容器的命令行
docker restart 容器名或者容器ID 重启容器
docker rm 容器名 删除容器
----- Docker 的文件是放在 /var/lib/docker/containers/ 中的
docker pause 容器名 暂停容器
docker unpause 容器名 取消暂停容器
docker kill 容器名docker top 容器名
docker stop 容器名 停止容器
docker stop,支持“优雅退出”。先发送SIGTERM信号,在一段时间之后(10s)再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号,然后做一些“退出前工作”,比如保存状态、处理当前请求等。
docker kill,发送SIGKILL信号,应用程序直接退出。
docker inspect 容器名 查看Docker的底层信
docker logs 容器名
docker diff 容器名
docker commit 容器名 镜像名 : 保存容器为镜像
docker top <CONTAINER_ID>:查看容器中运行的进程
docker port 容器名 # 查看映射端口对应的容器内部源端口
1. 运行镜像
Docker run IMAGE [COMMOND] [ARG...] 在新的容器中执行命令
例子:
docker run -t -i -c 100 -m 512MB -h test1 -d --name="docker_test1" ubuntu /bin/bash
# 创建一个 cpu 优先级为 100,内存限制 512MB,主机名为 test1,名为 docker_test1 后台运行 bash 的容器
docker run busybox /bin/echo Hello Docker
这条命令是运行 busybox
镜像中的 /bin/echo
命令,参数是 Hello Docker
:
结果:Hello Docker
-
一些常用的选项:
-
-i
交互式界面,默认是false
-
-t
伪终端,默认false
-
--name
容器别名,默认随机命名
一些常用的选项:
-i
交互式界面,默认是false
-t
伪终端,默认false
--name
容器别名,默认随机命名
exit
退出交互式界面,容器停止运行。Crtl+P
或者 Crtl+Q
退出交互式界面,容器在后台运行。(注意是大写P和Q)
docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker ps -l 查看最近一次运行的容器
删除容器时,容器必须是停止状态,否则会报错误。
1.2运行守护进程
docker run -d IMAGE [COMMOND] [ARG...]
docker run -d --name d1 ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done;"
b89b9ce64d34bd202a642c8190428f4776f15e882f138949259722f22120201a
返回一个守护进程ID,在后台,以 busybox 镜像为基础创建的一个容器,每一秒运行一次 echo hello world
命令
2. 查询容器的输出内容:
docker logs [-f] [-t] [--tail] 容器名或id 查看容器内WEB应用程序日志
-f --follow=true|false
,默认false,一直跟随log变化
-t --timestamps=true|false
,默认false,加上时间戳
--tail="all"
,返回最新多少条日志
例子 :docker logs -f -t --tail 2 b89b9ce64d34
在运行的容器中启动新的进程:
docker exec [-d] [-i] [-t] 容器名 [COMMOND] [ARG...]
3 attach
Docker 允许 attach 进入容器并与运行中的容器进行交互,同时允许查看容器内守护进程态下的程序的输出,使用以下两种方式退出容器:
- Ctrl+C 直接退出
- Ctrl+\ 退出并显示堆栈信息。
语法:docekr attach <Container>
那么还是刚刚那个容器:
命令 # docker run -d ubuntu /usr/bin/top -b
b33059d6c7427e377a1239eca59605e18bb6d145c4f12df6021db4896b6fcfa3
命令 # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b33059d6c742 ubuntu:latest "/usr/bin/top -b" 2 seconds ago Up 2 seconds backstabbing_jang
命令 # docker attach backstabbing_jang #此处也可以用docker attach b330
top - 05:30:49 up 16:04, 0 users, load average: 0.01, 0.19, 0.39
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.7 us, 2.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
KiB Mem: 1003080 total, 596484 used, 406596 free, 42524 buffers
KiB Swap: 1046524 total, 0 used, 1046524 free. 330716 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19744 1280 1008 R 0.0 0.1 0:00.08 top
top - 05:30:52 up 16:05, 0 users, load average: 0.01, 0.19, 0.39
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 1.0 sy, 0.0 ni, 94.3 id, 4.3 wa, 0.3 hi, 0.0 si, 0.0 st
KiB Mem: 1003080 total, 596484 used, 406596 free, 42528 buffers
KiB Swap: 1046524 total, 0 used, 1046524 free. 330712 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19744 1280 1008 R 0.0 0.1 0:00.08 top
4diff
docker diff <contianer> 用于显示容器的文件改动,包括 A(add),C(change),D(delete)。这些信息可以用于 debug,也可以用于快速信息共享。
示例:
命令 # docker run -t -i ubuntu /bin/bash
命令(容器内) root@cc9befbe64a1:/# nano a
bash: nano: command not found
命令(容器内)root@cc9befbe64a1:/# apt-get install nano
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
spell
The following NEW packages will be installed:
nano
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 194 kB of archives.
After this operation, 614 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main nano amd64 2.2.6-1ubuntu1 [194 kB]
Fetched 194 kB in 3s (54.3 kB/s)
Selecting previously unselected package nano.
(Reading database ... 11527 files and directories currently installed.)
Preparing to unpack .../nano_2.2.6-1ubuntu1_amd64.deb ...
Unpacking nano (2.2.6-1ubuntu1) ...
Setting up nano (2.2.6-1ubuntu1) ...
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
命令(容器内) root@cc9befbe64a1:/#
这个容器ID是cc9befbe64a1,于是可以新开一个终端:
命令 # docker diff cc9
A /.wh..wh.plnk/119.673746
A /.wh..wh.plnk/335.673670
C /bin
A /bin/nano
A /bin/rnano
C /etc
C /etc/alternatives
D /etc/alternatives/editor.fr.1.gz
省略部分输出
5inspect
用法:docker inspect <container>/<image>,用于收集容器的底层信息,包括如下内容:
实例的IP地址。
端口绑定
搜索特定的端口映射
搜集配置信息。
例如
命令 # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf57741249fb dockerui/dockerui:latest "/dockerui" 2 minutes ago Up 2 minutes 0.0.0.0:9000->9000/tcp trusting_hawking
命令 # docker inspect --format='{{.NetworkSettings.IPAddress}}' cf5
172.17.0.17
6 :import
用于导入 URL / 文件,从本地导入需要 - 参数。docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]、URL/-二选一。
和pull不同的时候,pull 是从docker 仓库里下载,而import 是从任意url 上下载,甚至是从本地文件系统,
最后都是添加到本地镜像 images列表中。
例如,我们导入 openvz 的 suse minimal 镜像:
命令# docker import http://mirrors.ustc.edu.cn/openvz/template/precreated/suse-13.1-x86-minimal.tar.gz suse:minimal #这里使用的是ustc镜像源。
Downloading from http://mirrors.ustc.edu.cn/openvz/template/precreated/suse-13.1-x86-minimal.tar.gz
127a9e7b9f87e4fc280c96bee9fad0a19057de38d307fe7fc1f6d35c86f1aff657.89 MB/57.89 MB
命令# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
suse minimal 127a9e7b9f87 2 minutes ago 149.1 MB
导入本地镜像:
cat suse-13.1-x86-minimal.tar.gz |docker import - suse:minmal
导入 Gentoo 的 stage3:
docker import http://mirrors.ustc.edu.cn/gentoo/releases/amd64/autobuilds/current-stage3-amd64/stage3-amd64-20150423.tar.bz2 gentoo:stage3
7 export
和 import 相反,export 将容器导出成 tar 压缩包。
例如
命令 # docker run -i -t -d suse:minimal /bin/bash
060f6e6c877af01313363b6506107438b9eb5ba87a7ef0625577e348a554ecca
命令 # docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
060f6e6c877a suse:minimal "/bin/bash" 2 seconds ago Up 2 seconds fervent_ritchie
命令 # docker export -o a.tar 060f
命令 # docker export 060f > a.tar #也可以这样。
4其他命令
1 cp
从容器内复制出文件到宿主机器:格式 docker cp container:path hostpat
命令 # docker cp 060:/etc/zypp/zypp.conf /tmp/ #060是容器ID的简写
命令 # cat /tmp/zypp.conf
## Configuration file for software management
## /etc/zypp/zypp.conf
##
## Boolean values are 0 1 yes no on off true false
省略。。
2 login
登录到 docker 仓库:
命令 # docker login
Username (qiuker521): qiuker521
WARNING: login credentials saved in /root/.dockercfg.
Login Succeeded
当然也可以登录到自己的私有服务器:docker login localhost:8080
logout # 从当前 Docker registry 退出
3 wait
用来获取容器的退出信号值。已退出的容器直接返回 exit 值,未退出的容器等待容器退出,然后返回 exit 值
4 events
获取 Docker 服务端的实时事件,例如 docker events 的同时运行 docker run ubuntu。
zypp/zypp.conf /tmp/ #060是容器ID的简写
命令 # cat /tmp/zypp.conf
## Configuration file for software management
## /etc/zypp/zypp.conf
##
## Boolean values are 0 1 yes no on off true false
省略。。