前端 Coder 手中的 Docker

举报
苏州程序大白 发表于 2022/05/23 16:15:14 2022/05/23
【摘要】 @[TOC](前端 Coder 手中的 Docker) ✨博主介绍🌊 作者主页:苏州程序大白🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司💬如果文章对你有帮助,欢迎关注、点赞、收藏💅 有任何问题欢迎私信,看到会及时回复💅关注苏州程序大白,分享粉丝福利 在服务器中安装 Docker在测试或开发环境中 D...

@[TOC](前端 Coder 手中的 Docker)

✨博主介绍

🌊 作者主页:苏州程序大白

🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司

💬如果文章对你有帮助,欢迎关注、点赞、收藏

💅 有任何问题欢迎私信,看到会及时回复
💅关注苏州程序大白,分享粉丝福利

在这里插入图片描述

在服务器中安装 Docker

在这里插入图片描述

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定 (stable) 版本安装在系统中。

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

安装完成后的推荐操作

  • 启动 docker
sudo systemctl enable docker
sudo systemctl start docker
  • 创建 docker 用户组
sudo groupadd docker
  • 将当前用户加入 docker 组
sudo usermod -aG docker $USER
  • 测试 docker 安装是否正确
docker run hello-world

修改镜像

1、登录阿里容器镜像服务

2、查看加速地址
在这里插入图片描述
3、设置加速服务

  • 创建目录
sudo mkdir -p /etc/docker
  • 创建文件并写入内容
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
  • 重新加载及重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker

4、查看镜像地址

docker info

镜像常用命令

  • 查看本机中所有镜像
命令 docker images [镜像名] 可查看当前镜像。
选型:

-q

只显示镜像 id

-a

列出所有镜像(包含中间映像层)

  • 搜索镜像
命令格式:docker search [options] 镜像名
选型:

-s

列出收藏数不少于指定值的镜像

--no-trunc

显示完整的镜像信息

  • 从仓库下载镜像

选型:

命令格式:docker pull 镜像名[:TAG|@DIGEST]


参数:

可以指定 TAG 或者 DIGEST

TAG

标签名

DIGEST
  • 删除镜像
命令格式:docker rmi 镜像名

选型:

可以指定 TAG 或者 DIGEST

-f

强制删除

容器常用命令

  • 运行容器
镜像名新建并启动容器

命令格式:docker run [选项] 镜像名
  • 选型
选型:

--name

别名为容器起一个名字

-d

启动守护式容器(在后台启动容器)

-p

映射端口号:原始端口号 指定端口号启动

--network

指定使用的网桥
docker run -it --name myTomcat -p 8888:8080 tomcat

docker run -d --name myTomcat -P tomcat
  • 查看运行的容器
列出所有正在运行的容器,命令格式:docker ps
选型:

-a

正在运行的和历史运行过的容器

-q

静默模式,只显示容器编号
  • 停止 | 关闭 | 重启容器
开启容器


docker start 容器名字或者容器id


重启容器


docker restart 容器名或者容器id


正常停止容器运行


docker stop 容器名或者容器id


立即停止容器运行


 docker kill 容器名或者容器id
  • 删除容器
删除单个容器

docker rm -f 容器id和容器名

删除所有容器

docker rm -f $(docker ps -aq)
  • 查看容器内进程
docker top 容器id或者容器名
  • 查看容器内部细节
docker inspect 容器id
  • 查看容器运行日志
命令格式:docker logs [OPTIONS] 容器id或容器名
选型:

-t

加入时间戳

-f

跟随最新的日志打印

--tail

数字 显示最后多少条
  • 进入容器内部
命令格式:docker exec [options] 容器id 容器内命令
选型:

-i

以交互模式运行容器,通常与 - t 一起使用

-t

分配一个伪终端 shell 窗口 bash


  • 容器和宿主机之间复制文件
将宿主机复制到容器内部

docker cp 文件|目录 容器id:容器路径

将容器内资源拷贝到主机上

docker cp 容器id:容器内资源路径 宿主机目录路径
  • 数据卷(volum)实现与宿主机共享目录
命令:docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名,宿主机与容器文件是互通的。

docker run -v 宿主机的路径|任意别名:/容器内的路径:ro 镜像名,容器机不能修改宿主机的文件内容。

注意:如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容如果是别名则会在 docker 运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中

  • 打包镜像
命令:docker save 镜像名:tag -o 名称.tar
  • 载入镜像
命令:docker load -i 名称.tar
  • 容器打包成新的镜像
命令:docker commit -m "描述信息" -a "作者信息" (容器id或者名称)打包的镜像名称:标签

容器间通信

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
在这里插入图片描述

  • 网桥
查看默认网桥
docker network ls

创建网桥
docker network create name

删除网桥
docker network rm name

删除没有使用的网桥
docker network prune

Dockerfile

Dockerfile 可以认为是 Docker 镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建 docker 镜像的构建文件。
在这里插入图片描述
通过架构图可以看出通过 DockerFile 可以直接构建镜像
在这里插入图片描述

保留字 作用
FROM 当前镜像是基于哪个镜像的 第一个指令必须是FROM
RUN 构建镜像时需要运行的指令
EXPOSE 当前容器对外暴露出的端口号
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 包
COPY 类似于 ADD,拷贝文件和目录到镜像中将从构建上下文目录中 <原路径> 的文件 / 目录复制到新的一层的镜像内的 < 目标路径 > 位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数

FROM 命令

基于那个镜像进行构建新的镜像,在构建时会自动从 docker hub 拉取 base 镜像 必须作为 Dockerfile 的第一个指令出现

语法:

FROM  <image>
FROM  <image>[:<tag>]     使用版本不写为latest
FROM  <image>[@<digest>]  使用摘要

RUN 命令

RUN 指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于 Dockerfile 中的下一步

语法:

RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN echo hello

RUN ["executable", "param1", "param2"] (exec form)
RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE 命令

用来指定构建的镜像在运行为容器时对外暴露的端口

语法:

EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

CMD 命令

用来为启动的容器指定执行的命令,在 Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令才会生效。

注意: Dockerfile 中只能有一条 CMD 指令。如果列出多个命令,则只有最后一个命令才会生效。

语法:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

WORKDIR 命令

用来为 Dockerfile 中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。如果 WORKDIR 不存在,即使它没有在任何后续 Dockerfile 指令中使用,它也将被创建。

语法:

WORKDIR /path/to/workdir

WORKDIR /a
WORKDIR b
WORKDIR c

注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对

ENV 命令

用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。

语法:

ENV <key> <value>
ENV <key>=<value> ...

ADD 命令

用来从 context 上下文复制新文件、目录或远程文件 url,并将它们添加到位于指定路径的映像文件系统中。

语法:

ADD hom* /mydir/       通配符添加多个文件
ADD hom?.txt /mydir/   通配符添加
ADD test.txt relativeDir/  可以指定相对路径
ADD test.txt /absoluteDir/ 也可以指定绝对路径
ADD url 

COPY 命令

用来将 context 目录中指定文件复制到镜像的指定目录中

语法:

COPY src dest
COPY ["<src>",... "<dest>"]

VOLUME 命令

用来定义容器运行时可以挂在到宿主机的目录

语法:

VOLUME ["/data"]
VOLUME /data

ENTRYPOINT 命令

用来指定容器启动时执行命令和 CMD 类似

语法:

  ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
  • ENTRYPOINT 指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
  • CMD 指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。

docker-compose

Linux 系统安装与卸载

在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。

sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Linux 手动下载

1、进入 GitHub 下载

2、将文件上传到服务器(Linux 机器)

3、将文件放入 /usr/local/bin/ 目录,并改名为 docker-compose

mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose

4、为其赋予可执行权限

sudo chmod +x /usr/local/bin/docker-compose

macos、windows

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。

卸载

sudo rm /usr/local/bin/docker-compose

文件基本格式

version: "3.2" # 官方网址 https://docs.docker.com/compose/compose-file/

services:
  tomcat01: #服务名称(id)
    container_name: tomcat01 # 相当于run 的 --name
    image: tomcat:8.0-jre8 #使用哪个镜像  相当于run image
    ports:  #用来完成host与容器的端口映射关系  相当于run -p
      - "8080:8080"
    volumes: #完成宿主机与容器中目录数据卷共享  相当于run -v
      #- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatwebapps01:/usr/local/tomcat/webapps
    networks: #代表当前服务使用哪个网络桥     相当于run --networ
      - hello

  tomcat02: #服务名称
    container_name: tomcat02
    image: tomcat:8.0-jre8 #使用哪个镜像
    ports:  #用来完成host与容器的端口映射关系
      - "8081:8080"
    volumes: #完成宿主机与容器中目录数据卷共享
      #- /root/apps:/usr/local/tomcat/webapps #使用自定义路径映射
      - tomcatwebapps02:/usr/local/tomcat/webapps
    networks: #代表当前服务使用哪个网络桥
      - hello

  mysql:
    image: mysql:5.7.32
    container_name: mysql
    ports:
      - "3307:3306"
    volumes:
      - mysqldata:/var/lib/mysql
      - mysqlconf:/etc/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
    networks:
      - hello

  redis:
    image: redis:5.0.10
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data
    networks:
      - hello
    command: "redis-server --appendonly yes" #run 镜像之后用来覆盖容器内容默认命令




volumes:  #声明上面服务所使用的自动创建的卷名
  tomcatwebapps01: #声明指令的卷名  compose自动创建该卷名但是会在之前加入项目名
    external:    #使用自定义卷名
      false       #true确定使用指定卷名  注意:一旦使用外部自定义卷名启动服务之前必须手动创建
  tomcatwebapps02:
  mysqldata:
  mysqlconf:
  redisdata:

networks: #定义服务用到桥
  hello: #定义上面的服务用到的网桥名称 默认创建就是 bridge
    external:
      true   #使用外部指定网桥  注意:网桥必须存在

常用命令

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的使用格式。

docker-compose 命令的基本的使用格式是

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

命令选项

-f, --file FILE

指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

-p, --project-name NAME

指定项目名称,默认将使用所在目录名称作为项目名。

网络特性:

--x-networking

使用 Docker 的可拔插网络后端特性

--x-network-driver DRIVER

指定网络后端的驱动,默认为 bridge

日志输出:

--verbose

输出更多调试信息。

-v, --version

打印版本并退出。

命令使用说明

up
格式为 docker-compose up [options] [SERVICE...]

该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。可以说,大部分时候都可以直接通过该命令来启动一个项目。

默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过 Ctrl-C 停止命令时,所有容器将会停止。
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

down
此命令将会停止 up 命令所启动的容器,并移除网络

 exec
进入指定的容器。

 ps
格式为 docker-compose ps [options] [SERVICE...]。

列出项目中目前的所有容器。-q 可以只打印容器的 id 信息

 restart
格式为 docker-compose restart [options] [SERVICE...]。

重启项目中的服务。

选项:

-t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。
 rm
格式为 docker-compose rm [options] [SERVICE...]。

删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。

选项:

-f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v 删除容器所挂载的数据卷。
 start
格式为 docker-compose start [SERVICE...]。

启动已经存在的服务容器。

 stop
格式为 docker-compose stop [options] [SERVICE...]。

停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。

选项:

-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
 top
查看各个服务容器内运行的进程。

 pause
格式为 docker-compose pause [SERVICE...]。

暂停服务

 unpause
格式为 docker-compose unpause [SERVICE...]。

恢复处于暂停状态中的服务。

💫点击直接资料领取💫

在这里插入图片描述

❤️关注苏州程序大白公众号❤️


👇 👇👇

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。