Docker实战——原理及常用命令

一、虚拟化及Docker简介

在这里插入图片描述

1、左图为os层的虚拟化架构,右图为全虚拟化架构

2、全虚拟化架构的典型为:虚拟机,os层的典型案例:docker

​ 注意:OS层虚拟化架构虚拟出来的系统要与底层操作系统共享系统内核

3、Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

4、集装箱化的优点:

  • 灵活:即使是复杂的应用程序也可封装。
  • 轻量级:容器利用并共享主机内核。
  • 便携式:您可以在本地构建,部署到云上并在任何地方运行。
  • 可扩展性:您可以增加和自动分发容器副本。
  • 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。

5、docker组成

  • Docker Client客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • Docker Container容器

6、docker架构

​ Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。

​ 注意:Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用

二、Docker环境的安装及操作

1、docker安装

yum install -y docker

2、启动docker

systemctl start docker

3、验证docker安装

docker run hello-world

4、查看docker命令使用方法

docker command --help

5、查找/下载镜像

docker search [镜像名]:[版本号]
docker pull [镜像名]:[版本号]

不填版本号默认最新版本(latest)

6、启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的高端口
  • -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 设置容器使用内存最大值;
  • –link=[]: 添加链接到另一个容器;
  • –expose=[]: 开放一个端口或一组端口;
  • –volume , -v: 绑定一个卷(目录映射);
  • –privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities;
  • –net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
    • bridge 使用docker daemon指定的网桥
    • host //容器使用主机的网络
    • container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
    • none 容器使用自己的网络(类似–net=bridge),但是不进行配置
  • --restart="no"指定容器停止后的重启策略;
    • no:容器退出时不重启
    • on-failure:容器故障退出(返回值非零)时重启
    • always:容器退出时总是重启
  • –rm=false: 指定容器停止后自动删除容器(不支持以docker run -d启动的容器);
  • --sig-proxy=true设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理;

命令解析器:

/etc/rc.local    把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了
/bin/bash    放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

实例:

docker run --name mynginx -dit -p 80:80 -v /data:/data nginx:latest /bin/bash

7、查看镜像

docker images

8、删除镜像

docker rmi [镜像名]:[版本号]/镜像ID

9、批量删除镜像

docker rmi `docker images -q` 或 docker rmi $(docker images -q)

强制删除镜像在rmi后面加上-f即可

10、删除所有镜像

docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)

11、查看启动中的容器

docker ps

12、查看关闭中的容器

docker ps -a

13、启动/关闭/重启容器

docker start [容器id/容器名]
docker stop [容器id/容器名]
docker restart [容器id/容器名]

14、删除容器

docker rm [容器id/容器名]

15、批量删除容器

docker rm `docker ps -a -q` 或 docker rm $(docker images -a -q)

16、查看容器中运行的进程

docker top [容器id/容器名]

17、移除所有的容器和镜像

docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)

18、进入容器

两种方式:

docker attach:此命令进入容器,容器退出,会导致容器的停止。
docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。

exec语法:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:

  • -d 分离模式: 在后台运行
  • -i 即使没有附加也保持STDIN 打开
  • -t 分配一个伪终端

实例:

在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本:

docker exec -it mynginx /bin/sh /root/runoob.sh

在容器 mynginx 中开启一个交互模式的终端:

docker exec -it  mynginx /bin/bash

19、从容器创建镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS说明:

  • -a 提交的镜像作者;
  • -c 使用Dockerfile指令来创建镜像;
  • -m 提交时的说明文字;
  • -p 在commit时,将容器暂停;

实例:

docker commit -a "runoob.com" -m "my apache" a404c6c174a2  mymysql:v1 

20、为镜像添加一个新的标签

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

实例:

 docker tag ubuntu:15.10 runoob/ubuntu:v3

21、 将指定镜像保存成 tar 归档文件

docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS 说明:

  • -o 输出到的文件。

实例:

docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3

22、导出和导入容器

导出本地某个容器,可以使用 docker export 命令。

docker export [容器id] > ubuntu.tar

导入容器快照

cat docker/ubuntu.tar | docker import - test/ubuntu:v1

三、DockerFile创建镜像

1、Dockerfile的基本结构

​ Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。

2、Dockerfile文件说明

​ Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以字符开头则被视为注释。可以在Docker文件中使用RUNCMDFROMEXPOSEENV等指令。

3、常用指令

  • FROM:指定基础镜像,必须为第一个命令
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:
  FROM mysql:5.6
注:
  tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
  • MAINTAINER: 维护者信息
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
    RUN <command>
exec执行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:
  RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
  • ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代一个单字符,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
  • COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
  • CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
    CMD ["executable","param1","param2"] (执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
示例:
    CMD echo "This is a test." | wc -
    CMD ["/usr/bin/wc","--help"]
注:
   CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
  • ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
示例:
    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    CMD ["-c"]
注:
   ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
  • LABEL:用于为镜像添加元数据
格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
  使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
  • ENV:设置环境变量
格式:
    ENV <key> <value>  #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
    ENV <key>=<value> ...  #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
    ENV myName John Doe
    ENV myDog Rex The Dog
    ENV myCat=fluffy
  • EXPOSE:指定于外界交互的端口
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
注:
  EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口
  • VOLUME:用于指定持久化目录
格式:
    VOLUME ["/path/to/dir"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
  一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
卷可以容器间共享和重用
容器并不一定要和其它容器共享卷
修改卷后会立即生效
对卷的修改不会对镜像产生影响
卷会一直存在,直到没有任何容器在使用它
  • WORKDIR:工作目录,类似于cd命令
格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (这时工作目录为/a)
    WORKDIR b  (这时工作目录为/a/b)
    WORKDIR c  (这时工作目录为/a/b/c)
注:
  通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
  • USER: 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
  USER user
  USER user:group
  USER uid
  USER uid:gid
  USER user:gid
  USER uid:group
 示例:
      USER www
 注:
  使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
  • ARG:用于指定传递给构建运行时的变量
格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
  • ONBUILD:用于设置镜像触发器
格式:
  ONBUILD [INSTRUCTION]
示例:
  ONBUILD ADD . /app/src
  ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
  当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被钥触发

实例:

# This my first nginx Dockerfile
# Version 1.0

# Base images 基础镜像
FROM centos

#MAINTAINER 维护者信息
MAINTAINER tianfeiyu 

#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 执行以下命令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm \
 && yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 运行以下命令
CMD ["nginx"]

在这里插入图片描述

4、使用 Dockerfile 创建镜像

docker build [OPTIONS] PATH | URL | -

OPTIONS说明:

  • --build-arg=[]设置镜像创建时的变量;
  • --cpu-shares设置 cpu 使用权重;
  • --cpu-period限制 CPU CFS周期;
  • --cpu-quota限制 CPU CFS配额;
  • --cpuset-cpus指定使用的CPU id;
  • --cpuset-mems指定使用的内存 id;
  • --disable-content-trust忽略校验,默认开启;
  • -f指定要使用的Dockerfile路径;
  • --force-rm设置镜像过程中删除中间容器;
  • --isolation使用容器隔离技术;
  • --label=[]设置镜像使用的元数据;
  • -m设置内存最大值;
  • --memory-swap设置Swap的最大值为内存+swap,"-1"表示不限swap;
  • --no-cache创建镜像的过程不使用缓存;
  • --pull尝试去更新镜像的新版本;
  • --quiet, -q安静模式,成功后只输出镜像 ID;
  • --rm设置镜像成功后删除中间容器;
  • --shm-size设置/dev/shm的大小,默认值是64M;
  • --ulimitUlimit配置。
  • --tag, -t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • --network 默认 default。在构建期间设置RUN指令的网络模式

实例:

docker build -t runoob/ubuntu:v1 . 

tion :使用容器隔离技术;

  • --label=[]设置镜像使用的元数据;
  • -m设置内存最大值;
  • --memory-swap设置Swap的最大值为内存+swap,"-1"表示不限swap;
  • --no-cache创建镜像的过程不使用缓存;
  • --pull尝试去更新镜像的新版本;
  • --quiet, -q安静模式,成功后只输出镜像 ID;
  • --rm设置镜像成功后删除中间容器;
  • --shm-size设置/dev/shm的大小,默认值是64M;
  • --ulimitUlimit配置。
  • --tag, -t 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
  • --network 默认 default。在构建期间设置RUN指令的网络模式

实例:

docker build -t runoob/ubuntu:v1 . 

注意:.Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你猜我猜不猜+1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值