docker操作
1、镜像资源的操作
[root@little ~ ]#docker image
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
Run ‘docker image COMMAND --help’ for more information on a command.
1)后面直接跟命令就可以进行相关操作:
[root@little ~ ]#docker image history
“docker image history” requires exactly 1 argument.
See ‘docker image history --help’.
Usage: docker image history [OPTIONS] IMAGE
Show the history of an image
2)搜索镜像资源:
[root@little ~ ]#docker search nginx
查看相关镜像来源以及使用量
从网上下载镜像资源:
[root@little ~ ]#docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
45b42c59be33: Pull complete
8acc495f1d91: Pull complete
ec3bd7de90d7: Pull complete
19e2441aeeab: Pull complete
f5a38c5f8d4e: Pull complete
83500d851118: Pull complete
Digest: sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
image id一样对应的是一个镜像,不同版本是在同一镜像基础上创建不同标签
3)查看有哪些镜像资源:
docker image ls
简写: docker images
4)删除镜像:
docker image rm 镜像名
简写: docker rmi 镜像名 这样只是删除一个标签
如果想彻底删除镜像,后面跟image id
5)镜像重命名:
docker tag 原镜像名:版本名 新镜像名:版本名
tag重命名是在原来的基础上新建一个新的,不改变原有存在的
标准的命名是:
registry_name/repository_name/image_name:tag
registry_name是注册服务器名字
repository_name是我们在docker.io上面注册的用户名
更改TAG为none的名称使用image id修改
docker tag 4cdc5dd7eaad nginx:latest
6)将本地镜像推送到docker.io
先登录账号:
登录公共仓库:
[root@little ~ ]#docker login docker.io
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: litxxxd
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
先按标准命名规范将镜像改名,docker.io可以省略:
[root@little ~ ]#docker tag centos7.8:latest docker.io/littlefun91/centos7.8:v1.0
然后直接推送:
[root@little ~ ]#docker push littlefun91/centos7.8
littlefun91/centos7.8 littlefun91/centos7.8:v1.0
[root@little ~ ]#docker push littlefun91/centos7.8:v1.0
The push refers to repository [docker.io/littlefun91/centos7.8]
fb82b029bea0: Mounted from daduber/centos7.8.2003
v1.0: digest: sha256:50b9a3bc27378889210f88d6d0695938e45a912aa99b3fdacfb9a0fef511f15a size: 529
这样就将本地镜像推送到docker.io自己的账户
镜像打包给别人用:
docker save -o 打包后的名(nginx.tar) 镜像名(nginx)
[root@little ~ ]#docker save -o nginx.tar nginx
[root@little ~ ]#ll
total 134096
-rw-r–r-- 1 root root 53 Feb 3 15:21 allip.txt
-rw-------. 1 root root 1564 Dec 29 20:19 anaconda-ks.cfg
-rwxr-xr-x 1 root root 109 Jan 31 11:06 date_test.py
-rw------- 1 root root 137274368 Feb 20 15:37 nginx.tar
-rwxr-xr-x 1 root root 133 Jan 31 11:40 py_shell2.py
-rwxr-xr-x 1 root root 67 Jan 31 11:20 py_shell.py
-rwxr-xr-x 1 root root 654 Feb 3 18:55 python_ping.py
-rwxr-xr-x 1 root root 120 Feb 3 15:30 shell_ping.sh
drwxr-xr-x 2 root root 24 Feb 2 20:17 static
-rw-r–r-- 1 root root 106 Jan 15 22:02 test.sh
-rw-r–r-- 1 root root 59 Feb 3 12:26 终端命令获取参数.py
在当前目录生成了打包后的镜像文件
7)导入压缩包镜像文件:
[root@little ~ ]#docker load -i nginx.tar
9eb82f04c782: Loading layer [>] 72.49MB/72.49MB
ffd3d6313c9b: Loading layer [>] 64.73MB/64.73MB
9b23c8e1e6f9: Loading layer [>] 3.072kB/3.072kB
0f804d36244d: Loading layer [>] 4.096kB/4.096kB
9f65d1d4c869: Loading layer [>] 3.584kB/3.584kB
2acf82036f38: Loading layer [>] 7.168kB/7.168kB
Loaded image: nginx:latest
2、容器的操作
容器是镜像的一个运行实例,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。容器是由镜像实例化而来的
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,
那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
docker ps -a 列出所有启动的容器,包括运行的和退出的
一、创建容器
1. 新建容器
使用docker create命令新建一个容器,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,
-i则让容器的标准输入保持打开。
docker create -it ubuntu:latest 使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。 2. 启动容器
使用docker start命令来启动一个已经创建的容器
$ docker start af
通过docker ps命令查看一个运行中的容器,ps -a 查看所有容器
只显示容器的id: docker ps -q 或者 docker ps -qa -q是只列出container IDs 另起一个终端,查看正在运行的容器: docker container ls 3. 新建并启动容器
docker run 等价于先执行docker create命令,再执行docker start命令 -it
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
$ docker run -it --name ccc ubuntu:18.04 /bin/echo 'Hello World' --name 设定容器名字 不设置随机生成 [root@220 ~ ]# docker run -dit --name myngix nginx /bin/sh [root@220 ~ ]# docker run -dit -p 8022:80 nginx 启动时,一般镜像放最后 后面只能跟命令或参数
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
1)检查本地是否存在指定的镜像,不存在就从公有仓库下载;
2)利用镜像创建一个容器,并启动该容器
3)分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
5)从网桥的地址池配置一个IP地址给容器;
6)执行用户指定的应用程序;
7)执行完毕后容器被自动终止;
命令执行后出错,会默认返回错误码,默认情况下,常见错误代码包括:
1) 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
2) 126:所指定命令无法执行,例如权限出错
3) 127:容器内命令无法找到。
docker run -v参数
格式:
-v 本地目录:容器目录 或 -v 容器目录
-v /usr/local/docker_registry:/var/lib/registry
把主机的/usr/local/docker_registry 目录挂载到registry容器的/var/lib/registry目录下
假如有删除容器操作,我们的镜像也不会被删除
其他参数:
-d: 后台运行容器 后台运行无需添加命令
-p: 端口映射 5005:5004 指定主机的5005端口映射到容器的5004端口
-i: 表示启动一个可交互的容器,并持续打开标准输入
-t: 表示使用终端关联到容器的标准输入输出上
-it: 以交互模式运行启动容器
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。 --rm: 容器退出时就删除容器 --name: 给容器命名,不命名会随机生成 但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要, 因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统 方便一次性运行容器 在宿主机上可以看到docker的进程 参数 -a, --attach=[] Attach to stdin, stdout or stderr. -c, --cpu-shares=0 CPU shares (relative weight) ---------------------# 设置cpu使用权重 –cidfile="" Write the container ID to the file ------------------------ # 把容器id写入到指定文件 –cpuset="" CPUs in which to allow execution (0-3, 0,1) ----------------- # cpu绑定 -d, --detach=false Detached mode: Run container in the background, print new container id -----# 后台运行容器 –dns=[] Set custom dns servers ---------------- # 设置dns –dns-search=[] Set custom dns search domains -------------- # 设置dns域搜索 -e, --env=[] Set environment variables ---------------- # 定义环境变量 –entrypoint="" Overwrite the default entrypoint of the image –env-file=[] Read in a line delimited file of ENV variables ----- # 从指定文件读取变量值 –expose=[] Expose a port from the container without publishing it to your host -------- # 指定对外提供服务端口 -h, --hostname="" Container host name ---------- # 设置容器主机名 -i, --interactive=false Keep stdin open even if not attached ------------------ # 保持标准输出开启即使没有attached –link=[] Add link to another container (name:alias) ----------- # 添加链接到另外一个容器 –lxc-conf=[] (lxc exec-driver only) Add custom lxc options --lxc-conf=“lxc.cgroup.cpuset.cpus = 0,1” -m, --memory="" Memory limit (format: , where unit = b, k, m or g) # ------------内存限制 –name="" Assign a name to the container ----------------------- # 设置容器名 –net=“bridge” Set the Network mode for the container ---------------- # 设置容器网络模式 ***** ‘bridge’: creates a new network stack for the container on the docker bridge ***** ‘none’: no networking for this container ***** ‘container:<name|id>’: reuses another container network stack ***** ‘host’: use the host network stack inside the container. ***** Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure. -P, --publish-all=false Publish all exposed ports to the host interfaces -------- # 自动映射容器对外提供服务的端口 -p, --publish=[] Publish a container’s port to the host ------------ # 指定端口映射 ***** format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort ***** (use ‘docker port’ to see the actual mapping) –privileged=false Give extended privileges to this container ------------ # 提供更多的权限给容器 –rm=false Automatically remove the container when it exits (incompatible with -d) ---------------------------------------- # 如果容器退出自动移除和-d选项冲突 –sig-proxy=true Proxify received signals to the process (even in non-tty mode). SIGCHLD is not proxied. # ? -t, --tty=false Allocate a pseudo-tty ---------- – # 分配伪终端 -u, --user="" Username or UID ---------------- # 指定运行容器的用户uid或者用户名 -v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from docker: -v /container) ------------ # 挂载卷 –volumes-from=[] Mount volumes from the specified container(s) ------------ # 从指定容器挂载卷- -w, --workdir="" Working directory inside the container -------------- # 指定容器工作目录 4. 守护态运行
添加-d参数来实现守护态形式运行,容器启动后会返回一个唯一的id,可以通过docker ps来查看容器信息。
不会占用当前终端
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
要获取容器的输也信息,可以使用docker logs命令(ce5为容器id前缀):
$ docker logs ce5 docker进程在宿主机上是可以查到的
二、终止容器
可以使用docker stop来终止一个运行中的容器,该命令格式为docker stop [-t|–time[=10]] [CONTAINER…]
首先向容器发送SIGTERM信号,等待一段超过时间(默认为10秒)后,
再发送SIGKILL信号来终止容器(ce5为容器id前缀 容器名):
$ docker stop ce5
docker kill命令会直接发送SIGKILL信号来强行终止容器
此外,当Docker容器中指定的应用终结时,容器也会自动终止。对于只启动了一个终端的容器,
用户通过exit命令或ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
docker restart命令会将一个运行态的容器先终止,然后再重新启动它。
退出容器: exit 退出后容器仍在运行 或 ctrl+D
三、进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
如果需要进入容器进行操作,有多种办法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。
1. attach命令
attach命令是Docker自带的命令,命令格式为:
docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[=true]] CONTAINER
支持三个主要选项:
1) --detach-keys=[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
2) --no-stdin=true|false:是否关闭标准输入,默认是保持打开;
3) --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true;
当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。
当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2. exec命令
exec命令可以在窗口内直接执行任意命令。
docker exec [-d|–detach] [–detach-keys[=[]]] [-i|–interactive] [–privileged] [-t|–tty] [-u|–user[=USER]] CONTAINER COMMAND [ARG…]
比较重要的参数有
1) -i,–interactive=true|false:打开标准输入接受用户输入命令,默认为false;
2)–privileged=true|false:是否给执行命令以高权限,默认为false;
3)-t, --tty=true|false:分配伪终端,默认为false;使用终端关联到容器的输入输出
4)-u, --user=“”:执行命令的用户名或ID;
$ docker exec -it 243c32535da7 /bin/bash
3. nsenter工具
在util-linux软件包版本2.23+中包含nsenter工具。如果系统中的util-linux包没有该命令,
可以按照下面的方法从源码安装:
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-;cd util-linux-2.24; $ ./configure --without-ncurses $ make nsenter && cp nsenter /usr/local/bin
为了使用nsenter连接到容器,还需要找到容器进程的PID,可以通过下面的命令获取:
PID = $(docker inspect --format "{{.State.Pid}}" <container>)
通过这个PID,就可以连接到这个容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
四、删除容器
使用docker rm命令为删除处于终止或退出状态的容器,命令格式为 删除容器名
docker rm [-f|–force] [-l|–link] [-v|–volumes] CONTAINER [CONTAINER…]
主要支持的选项包括
1) -f, --force=false:是否强行终止并删除一个运行中的容器
2) -l, --link=false:删除容器的连接,但保留容器
3) -v, --volumes=false:删除容器挂载的数据卷。
一条命令实现停用并删除容器: docker stop $(docker ps -q) & docker rm $(docker ps -aq) 删除退出的容器: for i in `docker ps -a |grep -i exit|awk '{print $1}'`;do docker rm $i;done
五、导入和导出容器
1. 导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,
可以使用docker export命令,格式为
docker export [-o|–output[=“”]] CONTAINER。其中,可以通过-o选项来指定导出的tar文件名,
也可以直接通过重定向来实现
docker export是用来将container的文件系统进行打包的
docker export需要指定container,不能像docker save那样指定image或container都可以。 $ docker export -o hello1.tar a4d $ docker export a4d > hello2.tar 将容器生成新的镜像资源 docker commit -p 容器名 打包成的新的资源名(镜像名) -p暂停容器 [root@little ~ ]#docker commit -p mynginx nginx_with_curl 这样生成的镜像就是把容器中自己的操作固化到新的镜像中 镜像打包给别人用: docker save -o 打包后的名(nginx.tar) 镜像名(nginx) 或者 docker save 镜像名(nginx) >打包后的名(nginx.tar) 2. 导入容器
导出的文件可以通过docker import命令导入变成镜像
docker import [-c|–change[=[]]] [-m|-message[=MESAGE]] file|URL - [REPOSITORY[:TAG]]
用户可以通过-c,–change=[]选项在导和的同时执行对容器进行修改的Dockerfile指令
导入压缩包镜像文件: [root@little ~ ]#docker load -i nginx.tar 即可以使用docker load命令来导入镜像存储文件到本地镜像库, 也可以使用docker import命令来导入一个容器快照到本地镜像库
两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),
而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
总结一下docker save和docker export的区别: docker save保存的是镜像(image),docker export保存的是容器(container); docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像; docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。 [root@220 ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest e66264b98777 9 days ago 5.53MB littlefun91/nginx_with_curl v1.0 37ca15573013 15 months ago 204MB nginx latest 37ca15573013 15 months ago 204MB [root@220 ~ ]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae2577d47294 nginx "/docker-entrypoint.…" 18 hours ago Up 18 hours 0.0.0.0:8022->80/tcp, :::8022->80/tcp magical_moser 7475810896e5 alpine "/bin/sh" 18 hours ago Up 4 minutes exciting_kirch docker export是将容器导出 [root@220 ~ ]# docker export exciting_kirch >alpine.tar 导入时可以将镜像改名 改版本号 [root@220 ~ ]# docker import alpine.tar alpine:v2.23 [root@220 ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine v2.23 34a79b8ee961 5 seconds ago 5.53MB alpine latest e66264b98777 9 days ago 5.53MB nginx latest 37ca15573013 15 months ago 204MB littlefun91/nginx_with_curl v1.0 37ca15573013 15 months ago 204MB docker save 是将镜像导出: [root@220 ~ ]# docker save alpine >alpine.tar docker load 导入时啥也改不了,是原来的名称和版本号 [root@220 ~ ]# docker load -i alpine.tar Loaded image: alpine:latest [root@220 ~ ]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest e66264b98777 9 days ago 5.53MB nginx latest 37ca15573013 15 months ago 204MB littlefun91/nginx_with_curl v1.0 37ca15573013 15 months ago 204MB
手把手教你玩转docker(二):https://developer.aliyun.com/article/1495471