1.2 Docker操作基础
镜像
-
概念
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。
由于 Docker 使用一个统一文件系统,Docker 进程认为整个文件系统是以读写方式挂载的。 但是所有的变更都发生顶层的可写层,而下层的原始的只读镜像文件并未变化。由于镜像不 可写,所以镜像是无状态的。
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 镜像是上层镜像的父镜像。
一个没有任何父镜像的镜像,谓之基础镜像。
-
查找
使用 docker search 命令查找默认仓库中的镜像
[aaa@qq.com ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 9145 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1374 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 597 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 392 [OK]
常用选项:
--automated 只列出 automated build类型的镜像
--no-trunc 显示完整的镜像描述
-s 列出收藏数不小于指定值的镜像
-
获取
使用 docker image pull 命令来从仓库获取所需要的镜像
[aaa@qq.com ~]# docker image pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
911c6d0c7995: Pull complete
d0c5e0e017dc: Pull complete
ec6394c255ac: Pull complete
8c7e85b0e988: Pull complete
Digest: sha256:3d36a2c9513a5aa6aa6c41b076201d468bdb94c4f2b4c6e55d32a461ac8f00ee
Status: Downloaded newer image for nginx:1.14-alpine
常用选项:
-a 拉取所有 tagged 镜像
--disable-content-trust 忽略镜像的校验,默认开启
-
查看
使用 docker image ls 命令来显示本地所有的镜像
别名:docker image <ls | list | images>
[aaa@qq.com ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine acc350649a48 3 weeks ago 18.6MB
-
删除
使用 docker image rmi 命令删除本地镜像
[aaa@qq.com ~]# docker image rmi busybox:latest
Untagged: busybox:latest
Untagged: aaa@qq.com:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd
Deleted: sha256:e1ddd7948a1c31709a23cc5b7dfe96e55fc364f90e1cebcde0773a1b5a30dcda
Deleted: sha256:f9d9e4e6e2f0689cd752390e14ade48b0ec6f2a488a05af5ab2f9ccaf54c299d
常用选项:
-f 强制删除,不保留已有容器
--no-prune 不移除该镜像的过程镜像,默认移除
容器
-
概念
容器本质上是进程,我们原先是在一个操作系统上装很多个服务,比如nginx,mysql,或者其他的服务器,掺杂到系统里面,现在有个容器以后,我会在操作系统中运行mysql容器,nginx容器,或者tomcat容器,会把这个3个进程全部打包到容器里面,这样的话,如果这个进程想要的话,我们就把这个容器启动起来,我们这个进程想把这个容器删掉。所以很显而易见docker它不是虚拟化技术。
-
创建
使用 docker container create 命令新建容器
aaa@qq.com ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6fa8be31051f busybox:latest "sh" 10 seconds ago Created quirky_ramanujan
-
启动
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
新键并启动
使用 docker container run 命令来新建容器并启动
[aaa@qq.com ~]# docker run --name webserver -d nginx:1.14-alpine
92332b871efa7d104e4a32d82bba8368e3a0b9fc60de89a5ddba14d29136c887
常用选项:
-a stdin 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
-d 后台运行容器,并返回容器ID
-i 以交互模式运行容器,通常与 -t 同时使用
-p 端口映射,格式为:主机(宿主)端口 容器端口
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="nginx-lb" 为容器指定一个名称
--dns 8.8.8.8 指定容器使用的DNS服务器,默认和宿主一致
--dns-search example.com 指定容器DNS搜索域名,默认和宿主一致
-h "mars" 指定容器的hostname
-e username="ritchie" 设置环境变量
--env-file=[] 从指定文件读入环境变量
--cpuset="0-2" or --cpuset="0,1,2" 绑定容器到指定CPU运行
-m 设置容器使用内存最大值
--net="bridge" 指定容器的网络连接类型,支持 bridge/host/none/container 四种类型
--link=[] 添加链接到另一个容器
--expose=[] 开放一个端口或一组端口
重新启动
使用 docker container start 命令重新启动停止状态的容器
[aaa@qq.com ~]# docker start webserver
webserver
常用选项:
start 启动一个或多个处于停止状态的容器
stop 暂停一个处于UP状态的容器
restart 重启容器
-
查看
使用 docker container ps 查看容器当前的状态
别名:docker container <ls | list>
[aaa@qq.com ~]# docker ps
容器ID 镜像名 运行的命令 运行时间 状态 映射端口 名称
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92332b871efa nginx:1.14-alpine "nginx -g 'daemon of…" 21 minutes ago Up 11 minutes 80/tcp webserver
常用选项:
-a 显示所有的容器,包括未运行的
-f 根据条件过滤显示的内容
--format 指定返回值的模板文件
-l 显示最近创建的容器
-n 列出最近创建的n个容器
--no-trunc 不截断输出
-q 静默模式,只显示容器编号
-s 显示总的文件大小
-
暂停
使用 docker container pause/unpause 暂停或继续容器
pause
[aaa@qq.com ~]# docker container pause Bbox
Bbox
[aaa@qq.com ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dda975cacb2d busybox:latest "sh" About a minute ago Up About a minute (Paused) Bbox
unpause
[aaa@qq.com ~]# docker container unpause Bbox
Bbox
[aaa@qq.com ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dda975cacb2d busybox:latest "sh" 3 minutes ago Up 3 minutes Bbox
-
中止
使用 docker container kill 中止一个或多个容器
[aaa@qq.com ~]# docker container kill webserver
webserver
常用选项:
-s 向容器发送一个信号
-
删除
使用 docker container rm 删除一个或多个容器
[aaa@qq.com ~]# docker container rm quirky_ramanujan
quirky_ramanujan
常用选项:
-f 通过SIGKILL信号强制删除一个运行中的容器
-l 移除容器间的网络连接,而非容器本身
-v -v 删除与容器关联的卷
Registry
Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可自建Registry,也可使用官方的Docker Hub
Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境
一个 Registry中可以存在多个Repository
Repository可分为“顶层仓库”和“用户仓库”
用户仓库名称格式为“用户名/仓库名”
每个仓库可以包含多个Tag(标签) ,每个标签对应一个镜像
-
制作镜像
制作镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个
基于已有镜像
首先使用已有镜像启动一个容器
[aaa@qq.com ~]# docker container run --name busybox -it busybox
修改容器中的可写层,此时容器被修改后,后退出容器
使用 docker container commit 命令制作新的镜像副本
[aaa@qq.com ~]# docker container commit -p busybox
sha256:7c206159e9c093374d9bb3ae41e15cdea37aa78b719db0ec2ecbe0c27f68d4b9
[aaa@qq.com ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7c206159e9c0 22 seconds ago 1.16MB
[aaa@qq.com ~]# docker container commit busybox jiangbowen/httpbbox:v0.1-1
sha256:03e0f0800758e927c51dd8f30ff5d3398093dea934f774ace5d82368c2d8bf30
[aaa@qq.com ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
jiangbowen/httpbbox v0.1-1 03e0f0800758 12 seconds ago 1.16MB
常用选项:
-a 作者信息
-c 修改内容列表
-m 提交信息
-p 暂停容器以创建镜像
Dockerfile
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
FROM centos:latest
LABEL maintainer="M30_Miriam <aaa@qq.com>"
ENV NGINX_VERSION="nginx-1.12.2"
COPY epel.repo /etc/yum.repos.d/
COPY nginx-1.12.2-1.el7_4.ngx.x86_64.rpm /data/
RUN yum install -y ${NGINX_VERSION} \
|| yum install -y ${NGINX_VERSION}-1.el7_4.ngx.x86_64.rpm \
&& yum clean all && rm -f /data/${NGINX_VERSION}-1.el7_4.ngx.x86_64.rpm
RUN echo "This is Miriam HomePage" > /usr/share/nginx/html/index.html
EXPOSE 80/tcp
CMD ["nginx", "-g", "daemon off;"]
常用指令:
FROM
语法:FROM <image>或FROM <image>:<tag>
第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)
MAINTAINER
语法: MAINTAINER <name>
指定维护者信息(已废弃)
LABEL
语法:LABEL <key>=<value> ...
指定标签信息,取代 MAINTAINER
RUN
语法:RUN <command> 或 RUN ["executable", "param1", "param2"]
前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。指定使用其它终端可以通过第二种方式实现。每条 RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行
CMD
支持三种语法:
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令
EXPOSE
语法: EXPOSE <port> [<port>...]
告诉 Docker 服务端容器暴露的端口号,供互联系统使用。在启动容器时需要通过 -P,Docker 主机会自动分配一个端口转发到指定的端口
ENV
语法: ENV <key> <value>
指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持
ADD
语法:ADD <src> <dest>
该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)
COPY
语法:COPY <src> <dest>
复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
当使用本地目录为源目录时,推荐使用 COPY
ENTRYPOINT
两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
VOLUME
语法:VOLUME ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
USER
语法:USER daemon
定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户
当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户。要临时获取管理员权限可以使用 gosu,而不推荐 sudo
WORKDIR
语法:WORKDIR /path/to/workdir
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录
可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径
ONBUILD
语法:ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令
HEALTHCHECK
语法:HEALTHCHECK [OPTIONS] CMD command
选项:
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
按照定义的参数在容器中执行操作,判断返回值:0为成功,1为故障,2为保留值。当返回值非0时关闭容器
STOPSIGNAL
语法:STOPSIGNAL signal
向容器中的进程发送信号,与 kill 命令的信号相同,9为强制杀死,15为中止
ARG
语法:ARG <name>[=<default value>]
定义一个变量,用户可以通过 --build-arg 在启动时传递给容器
推荐阅读
-
在Docker上用Nacos1.3容器连接MySQL5.6和8.0.18容器进入持久化的具体操作(Nacos单机版)
-
计算机视觉基础系列(python与opencv的操作与运用)(三)--像素操作
-
python文件基础之文件操作详细介绍
-
新手学PHP之数据库操作详解及乱码解决!_php基础
-
php入门学习知识点五 关于php数组的几个基本操作_php基础
-
Python数据分析常用库-pandas库基础操作
-
mysql操作类库1.2
-
PHP 基础教程之字符串操作
-
mysql常用基础操作语法(三)~~对数据的增删改操作【命令行模式】
-
DOM基础及php读取xml内容操作的方法,domxml_PHP教程