一、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开发应用,就需要把默认的路径更改到需要路径下或外挂存储。

  1. docker info 查看docker镜像的默认路径:Docker Root Dir: /var/lib/docker
  2. systemctl stop docker关闭docker服务
  3. 将原有数据迁移至新目录:
    mkdir /data/docker -p
    mv /var/lib/docker/* /data/docker/
  4. 查看并修改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(新增的)
    
  5. 重新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 <名称> 搜索镜像
  1. 从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

  2. 推送一个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=2
  • docker 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>:删除正在运行的容器
  1. 从image启动一个container(run)
    docker run命令首先会从特定的image创之上create一层可写的container,然后通过start命令来启动它。停止的container可以重新启动并保留原来的修改。run命令启动参数有很多,以下是一些常规使用说明:
Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载,
利用镜像创建并启动一个容器,
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层,
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去,
从地址池配置一个 ip 地址给容器,
执行用户指定的应用程序,
执行完毕后容器被终止,
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
  1. 使用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代替

  2. 运行出一个container放到后台运行
    # docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 2; done"
    输出:ae60c4b642058fefcc61ada85a610914bed9f5df0e2aa147100eab85cea785dc
    它将直接把启动的container挂起放在后台运行(这才叫saas),并且会输出一个CONTAINER ID,通过docker ps可以看到这个容器的信息。

  3. 端口映射与目录挂载
    端口映射形如-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-v1
    docker 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.7
    docker 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等不是很常用的命令,比较简单,请参考官网。
eventshistorylogs命令
这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
Logo

一站式 AI 云服务平台

更多推荐