docker 运维与命令详解
文章目录一、docker概述1.1 Docker环境信息二、常用运维命令二、docker服务 拉取与推送2.1 在docker index中搜索image(search)docker pull seanlook/centos:centos6docker pull dl.dockerpool.com:5000/mongo:latestdocker push seanlook/mongodocker
文章目录
一、docker概述
- Docker daemon( Docker守护进程)
Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。 - Client( Docker客户端)
Docker客户端是 Docker的用户界面,它接受用户命令和配置标识,并与 Docker daemon通信。 - Images( Docker镜像):
Docker镜像是一个只读模板,用于固化后容器的迁移。 - Container(容器)
容器是镜像的可运行实例。镜像和容器(类似于类和对象的关系)。 - Registry:
Docker Registry是一个集中存储与分发镜像的服务。一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。
Docker Registry可分为公有Docker Registry和私有Docker Registry。
常用 DockerRegistry 官网的 Docker Hub,我们可使用Docker命令下载并使用。
docker命令总分为以下几种:
-
docker命令详情【docker文档】,
docker --help显示所有可用参数。 -
Docker环境信息 —
docker [ info | version] -
容器生命周期管理 —
docker [create | exec | run | start | stop | restart | kill | rm | pause | unpause] -
容器操作运维 —
docker [ps | inspect | top | attach | wait | export | port | rename | stat ]
docker container文档docker container --help显示所有可用参数。 -
容器rootfs命令 —
docker [commit | cp | diff ] -
镜像 仓库 —
docker [login | pull | push | search ] -
本地镜像管理 —
docker [build | images | rmi | tag | save | import | load]
docker images文档docker images --help显示所有可用参数。 -
容器资源管理 —
docker [volume | network] -
系统日志信息 —
docker [events | history | logs]

二、修改docker默认存储路径
默认情况下,docker镜像的默认存储路径是/var/lib/docker,这相当于直接挂载系统目录下,而一般在搭系统时,这个区都不会太大,所以如果长期使用docker开发应用,就需要把默认的路径更改到需要路径下或外挂存储。
docker info查看docker镜像的默认路径:Docker Root Dir: /var/lib/dockersystemctl stop docker关闭docker服务- 将原有数据迁移至新目录:
mkdir /data/docker -pmv /var/lib/docker/* /data/docker/ - 查看并修改docker.service文件
systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to \ /usr/lib/systemd/system/docker.service. vi /usr/lib/systemd/system/docker.service #ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (注释原先的) ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph=/data/docker(新增的) - 重新enable 一下docker 服务 重新进行软连接 以及进行一次 daemon-reload
systemctl enable docker systemctl daemon-reload systemctl restart docker dokcer info # 查看docker info 信息 Docker Root Dir: /data/docker
三、docker服务详解
3.1 拉取与推送、搜索
-
镜像相关
-
docker search <name>:在Docker Hub(或阿里镜像)仓库中搜索关键字docker pull <name>:<tag>:从仓库中下载镜像,若要指定版本,则要在冒号后指定docker images: 列出已经下载的镜像docker rmi <name/container id>:删除本地镜像docker build: 构建镜像docker search <名称>搜索镜像
-
从docker registry server 中拉取image或repository(pull)
Usage: docker pull [OPTIONS] NAME[:TAG] 最好指定版本号# docker pull centos:centos6从公共仓库(包括自己是私人仓库)拉取,形如docker pull username/repository
# docker pull seanlook/centos:centos6从其他私服获取镜像(无网络),形如docker pull registry.domain.com:5000/repos:
# docker pull dl.dockerpool.com:5000/mongo:latest -
推送一个image或repository到registry(push)
与上面的pull对应,可以推送到Docker Hub的Public、Private以及私服,但不能推送到Top Level Repository。# docker push seanlook/mongo# docker push registry.tp-link.net:5000/mongo:2014-10-27
registry.tp-link.net也可以写成IP,172.29.88.222。
在repository不存在的情况下,命令行下push上去的会为我们创建为私有库,然而通过浏览器创建的默认为公共库。
3.2 容器运行相关(后台运行,映射端口,挂载卷,镜像同步)
docker run -d -p 91:80 nginx:在后台运行nginx,若没有镜像则先下载,并将容器的80端口映射为宿主机的91端口。- --name=“Name” 容器名字
- -d:后台运行
- -it:使用交互方式运行,进入容器查看内容
- -P:随机端口映射
- -p:指定端口映射
-p 主机端口: 容器端口(常用) - -v:挂载卷(目录映射)
-v 本机路径:容器路径(常用)
匿名挂载--不指定本机路径,使用docker volume inspect <dockerId>查看挂载路径 - -e:环境配置
- -net:网络模式
docker ps [-a|-l]:列出运行中的容器 [ 所有的容器 | 显示最新启动的容器(包括已停止的)]docker ps -n=int显示最近使用的容器: docker ps -n=2docker stop <容器id>:停止容器docker kill <容器id>:强制停止容器docker start <容器id>:启动已停止的容器docker inspect <容器id>:查看容器的所有信息,--format参数来指定输出的模板格式docker container logs <容器id>:查看容器日志docker top <容器id>:查看容器里的进程docker exec -it <容器id> /bin/bash:进入容器进行交互(新的交互)docker attach <容器id>:连接到正在运行的容器,或与容器的主进程进行交互(连接最近一次的交互)。exit:退出容器(若没有指定后台运行,退出时容器停止)Ctrl +P +Q退出容器(不管是否指定后台运行,容器不停止退出)docker rm <容器id>:删除已停止的容器docker rm -f <容器id>:删除正在运行的容器
- 从image启动一个container(run)
docker run命令首先会从特定的image创之上create一层可写的container,然后通过start命令来启动它。停止的container可以重新启动并保留原来的修改。run命令启动参数有很多,以下是一些常规使用说明:
-
Docker 在后台运行的标准操作包括:
-
检查本地是否存在指定的镜像,不存在就从公有仓库下载,
利用镜像创建并启动一个容器,
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层,
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去,
从地址池配置一个 ip 地址给容器,
执行用户指定的应用程序,
执行完毕后容器被终止,
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
-
使用image创建container并执行相应命令,然后停止
# docker run ubuntu echo "hello world"
hello word
这是最简单的方式,跟在本地直接执行echo ‘hello world’ 几乎感觉不出任何区别,而实际上它会从本地ubuntu:latest镜像启动到一个容器,并执行打印命令后退出(docker ps -l可查看)。需要注意的是,默认有一个--rm=true参数,即完成操作后停止容器并从文件系统移除。因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
使用image创建container并进入交互模式, login shell是/bin/bash# docker run -it --name mytest centos:centos6 /bin/bash
上面的–name参数可以指定启动后的容器名字,如果不指定则docker会帮我们取一个名字。镜像centos:centos6也可以用IMAGE ID代替 -
运行出一个container放到后台运行
# docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"输出:ae60c4b642058fefcc61ada85a610914bed9f5df0e2aa147100eab85cea785dc
它将直接把启动的container挂起放在后台运行(这才叫saas),并且会输出一个CONTAINER ID,通过docker ps可以看到这个容器的信息。 -
端口映射与目录挂载
端口映射形如-p <host_port:contain_port>,存在以下主要两种写法:-p 11211:11211默认:绑定主机所有网卡(0.0.0.0)的11211端口到容器的11211端口上-p 127.0.0.1:11211:11211只绑定localhost这个接口的11211端口目录映射形如
-v <host_path:container_path>,绑定多个目录时再加-v。-v /tmp/docker:/tmp/docker两个container之间建立联系:先运行父容器,然后运行子容器,子容器继承父容器的挂载,这样两个容器之间的目录数据就会同步。
docker run -it -d --name centos01 -v /opt:/home/usernam centos-v1docker run -it -d --name centos02 --volums-from centos01 centos-v1多个容器实现mysql数据共享(同步)
docker run -d -p 8080:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/conf.d -v /var/lib/mysql --name mysql_01 mysql5.7docker run -d -p 8080:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql_02 --volums-from mysql_01 mysql5.7
例子:
sudo docker run --name nginx_test -v /tmp/docker:/usr/share/nginx/html:ro -p 80:80 -d nginx:1.7.6
在主机的 /tmp/docker 下建立 index.html,就可以通过http://localhost:80/或http://host-ip:80访问了。sudo docker run --rm --net=host -v /data/log:/server/log -d server:v1.0 -p 10007 -n 3 -t 3 -I
3.3 commit 容器固化新image
docker commit -a="提交人" -m="本次提交信息" <containerID> 目标镜像名:[tag]
只能提交正在运行的container,即通过docker ps可以看见的容器。
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c9fdf26326c9 nginx:1 nginx -g.. 3 hours ago Exited (0).. nginx_test
[root@hostname docker]$ sudo docker start c9fdf26326c9
c9fdf26326c9
$ sudo docker commit -m "some tools installed" fcbd0a5348ca seanlook/ubuntu:14.10_tutorial
fe022762070b09866eaab47bc943ccb796e53f3f416abf3f2327481b446a9503
请注意,当你反复去commit一个容器的时候,每次都会得到一个新的IMAGE ID,假如后面的repository:tag没有变,通过docker images可以看到,之前提交的那份镜像的repository:tag就会变成:,所以尽量避免反复提交。
另外,观察以下几点:
commit container只会pause住容器,这是为了保证容器文件系统的一致性,但不会stop。
-
如果你要对这个容器继续做其他修改:
-
你可以重新提交得到新image2,删除次新的image1
也可以关闭容器用新image1启动,继续修改,提交image2后删除image1
当然这样会很痛苦,所以一般是采用Dockerfile来build得到最终image
虽然产生了一个新的image,并且你可以看到大小有100MB,但从commit过程很快就可以知道实际上它并没有独立占用100MB的硬盘空间,而只是在旧镜像的基础上修改,它们共享大部分公共的“片”。
下
3.3 保存镜像
sudo docker save -o save_name.tar container_name:tag
四、示例
1. 开启/停止/重启container(start/stop/restart)
容器可以通过run新建一个来运行,也可以重新start已经停止的container,但start不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。容器stop(或Ctrl+D)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入attach进去的界面是一样的,与第一次run启动或commit提交的时刻相同。
CONTAINER_ID=$(sudo docker ps |grep "REPOSITORY" | awk '{print$1}')
docker stop $CONTAINER_ID
docker restart $CONTAINER_ID
服务器启动docker,后台运行jupyter notebook, 远程机器访问jupyter
命令依次为:启动docker、进入容器、后台运行jupyter、查看日志、本地访问运行
示例:
sudo docker run --rm -it -d -p 10005:8888 -v /home/docker_files:/tmp tf_xgboost:v0.1 /bin/bash
sudo docker exec -it $containerID /bin/bash
nohup jupyter notebook --no-browser --port=8888 --ip=* --allow-root > /tmp/jupyter.log 2>&1 &
tail -f /tmp/jupyter.log
访问:http://ip:10005/?token=3613bf01a9cd4f8c5cbec8f8f224863940d73616a077eca3
2. 连接到正在运行中的container(attach)
要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。attach是可以带上--sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。# docker attach --sig-proxy=false $CONTAINER_ID
3. 查看image或container的底层信息(inspect)
inspect的对象可以是image、运行中的container和停止的container。
查看容器的内部IP# docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID
172.17.42.35
3. 删除/停止container、image
在删除容器前,必须先停止容器。
若是想要删除整个镜像,也必须先停止容器服务,删除容器,最后删除镜像。
停止单个容器服务:docker stop <container_id/contaner_name>
删除单个容器服务:docker rm <container_id/contaner_name>
停止所有容器:docker stop $(docker ps -a -q)
删除所有的容器:docker rm $(docker ps -a -q)
删除镜像:docker rmi <image_id/image_name ...>
下面是一个完整的示例:
$ sudo docker images <==
ubuntu 13.10 195eb90b5349 4 months ago 184.6 MB
ubuntu saucy 195eb90b5349 4 months ago 184.6 MB
seanlook/ubuntu rm_test 195eb90b5349 4 months ago 184.6 MB
删除seanlook仓库中的tag <==
$ sudo docker rmi seanlook/ubuntu:rm_test
Untagged: seanlook/ubuntu:rm_test
先删除由这个镜像启动的容器 <==
$ sudo docker rm eef3648a6e77
删除镜像 <==
$ sudo docker rmi 195eb90b5349
Deleted: 195eb90b534950d334188c3627f860fbdf898e224d8a0a11ec54ff453175e081
Deleted: 209ea56fda6dc2fb013e4d1e40cb678b2af91d1b54a71529f7df0bd867adc961
Deleted: 0f4aac48388f5d65a725ccf8e7caada42f136026c566528a5ee9b02467dac90a
Deleted: fae16849ebe23b48f2bedcc08aaabd45408c62b531ffd8d3088592043d5e7364
Deleted: f127542f0b6191e99bb015b672f5cf48fa79d974784ac8090b11aeac184eaaff
4. 创建docker image
build命令可以从Dockerfile和上下文来创建镜像:【docker build 文档】
docker build [OPTIONS] PATH | URL | -
上面的PATH或URL中的文件被称作上下文,build image的过程会先把这些文件传送到docker的服务端来进行的。
如果PATH直接就是一个单独的Dockerfile文件则可以不需要上下文;如果URL是一个Git仓库地址,那么创建image的过程中会自动git clone一份到本机的临时目录,它就成为了本次build的上下文。
FROM # 基础镜像源,一切从这里开始构建
MAINTAINER # 镜像作者,姓名+邮箱(标准写法)
RUN # 镜像构建时需要运行的命令
ADD # 需要添加的其他压缩包(自动解压),例如:Anaconda等
WORKDIR # 镜像的工作目录
EXPOSE # 暴露的端口(与-p 指令功能一样)
CMD # 指定容器启动时运行的命令,只有最后一个生效,可被替代
ENTRYPOINT # 指定容器启动时运行的命令,用于追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候就会运行 ONBUILD的指令,触发指令。
COPY # 类型ADD,复制文件到镜像中
ENV # 构建时设置环境变量
一个简单的例子
Dockerfile
FROM centos
VOLUME ["volume01","volume01"]
CMD echo "-----"
CMD /bin/bash
命令参数说明:
这里挂在的"volume01","volume01"是匿名挂载(位置:容器内根目录下),通过docker inspect <dockerId> 找到Mounts可以看到挂载在本机的目录
docker build -f /home/username/Dockerfile -t centos:01 .
创建命令参数说明:
-f指定Dockerfile文件路径-t生产镜像标签.在当前目录生成(别忘了命令最后这个点)
小例子:创建自己的 centos
Dockerfile文件
FROM centos
MAINTAINER username<xxxxxxxx.qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "============"
CMD /bin/bash
-
参数说明:
- MYPATH:运行进入docker时所在的目录
执行构建命令:docker build -f Dockerfile -t mycentos:0.1 .
查看镜像构建流程:docker history <ImageId>
请看下面的例子:
$ sudo cat Dockerfile
FROM seanlook/nginx:bash_vim
EXPOSE 80
ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash
# -t指定镜像名称,末尾的点标识Dockerfile文件的路径
$ sudo docker build -t seanlook/nginx:bash_vim_Df .
Sending build context to Docker daemon 73.45 MB
Sending build context to Docker daemon
Step 0 : FROM seanlook/nginx:bash_vim
---> aa8516fa0bb7
Step 1 : EXPOSE 80
---> Using cache
---> fece07e2b515
Step 2 : ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash
---> Running in e08963fd5afb
---> d9bbd13f5066
Removing intermediate container e08963fd5afb
Successfully built d9bbd13f5066
上面的PATH为.,所以在当前目录下的所有文件(不包括.dockerignore中的)将会被tar打包并传送到docker daemon(一般在本机),从输出我们可以到Sending build context...,最后有个Removing intermediate container的过程,可以通过--rm=false来保留容器。
TO-DO
docker build github.com/creack/docker-firefox失败。

5. 给镜像打上标签(tag)
tag的作用主要有两点:一是为镜像起一个容易理解的名字,二是可以通过docker tag来重新指定镜像的仓库,这样在push时自动提交到仓库。
将同一IMAGE_ID的所有tag,合并为一个新的# docker tag 195eb90b5349 seanlook/ubuntu:rm_test
新建一个tag,保留旧的那条记录# docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag
6. docekr运行事件、镜像的创建历史、日志
docker还有一些如login、cp、logs、export、import、load、kill等不是很常用的命令,比较简单,请参考官网。events、history和logs命令
这3个命令用于查看Docker的系统日志信息。events命令会打印出实时的系统事件;history命令会打印出指定镜像的历史版本信息,即构建该镜像的每一层镜像的命令记录;logs命令会打印出容器中进程的运行日志。
-
docker events [options]:从服务器获取实时事件。
OPTIONS说明:-f:根据条件过滤事件;--since:从指定的时间戳后显示所有事件;--until:流水时间显示到指定的时间为止; -
docker history [options] image:查看指定镜像的创建历史。
OPTIONS说明:-H:以可读的格式打印镜像大小和日期,默认为true;--no-trunc:显示完整的提交记录;-q:仅列出提交记录ID。 -
docker logs [options] containerID: 查看指定容器的日志。
Options:--details显示更多的信息-f, --follow跟踪日志输出,最后一行为当前时间戳的日志--since string显示自具体某个时间或时间段的日志--tail string从日志末尾显示多少行日志, 默认是all-t, --timestamps显示时间戳
---------示例--------------------$ docker logs -f -t --since="2020-02-08" --tail=100 CONTAINER_ID:查看2020-02-08后的日志,显示后100行$ docker logs --since 30m CONTAINER_ID:查看最近30分钟的日志$ docker logs -t --since="2020-02-08T13:23:37" --until "2020-02-09T12:23:37" CONTAINER_ID:查看时间段内日志 -
查看docker服务的日志:
查看所有日志:journalctl -u docker --no-pager
查看最近200条日志【分页】:journalctl -u docker -n 200
查看最近200条日志【不分页】:journalctl -u docker -n 200 --no-pager
附:可视化面板安装
sudo docker run -d -p 8000:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock\
--privileged=true \
portainer/portainer
更多推荐




所有评论(0)