前端 Coder 手中的 Docker
✨博主介绍
在服务器中安装 Docker
修改镜像
镜像常用命令
容器常用命令
容器间通信
Dockerfile
FROM 命令
RUN 命令
EXPOSE 命令
CMD 命令
WORKDIR 命令
ENV 命令
ADD 命令
COPY 命令
VOLUME 命令
ENTRYPOINT 命令
docker-compose
Linux 系统安装与卸载
Linux 手动下载
macos、windows
卸载
文件基本格式
常用命令
命令选项
命令使用说明
💫点击直接资料领取💫
✨博主介绍
🌊 作者主页:苏州程序大白
🌊 作者简介:🏆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 标签名 DIGES
删除镜像
命令格式: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 指令。如果列出多个命令,则只有最后一个命令才会生效。
语法:
EXPOSE 80/tcp 如果没有显示指定则默认暴露都是tcp EXPOSE 80/udp
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...]。 恢复处于暂停状态中的服务。