基础信息
配置文件daemon.json
-
如果是
windwos
环境的docker desktop
可以通过设置->Docker Engine
去修改配置,也可以到C:\\Users\\{用户名称}\\.docker
文件下修改daemon.json
配置文件 , -
如果是在
linux
环境下是/etc/docker/daemon.json
,mac环境是在~/.docker/daemon.json
注意修改完需要重启docker
javascript
// 配置文件
~/.docker/daemon.json
配置国内镜像源
eg: 常用的国内镜像源配置:
json
"registry-mirrors": [
"<https://docker.m.daocloud.io>",
"<https://docker.imgdb.de>",
"<https://docker-0.unsee.tech>",
"<https://docker.hlmirror.com>",
"<https://docker.1ms.run>",
"<https://func.ink>",
"<https://lispy.org>",
"<https://docker.xiaogenban1993.com>"
]
docker常用的命令
docker镜像相关使用命令
docker search
:搜索相关镜像文件docker pull
: 拉取镜像文件docker images
: 查看镜像docker rmi
: 删除镜像docker save
: 镜像打包成指定文件包docker load
: 镜像从文件包中载入docker build
: 镜像的构建docker push
: 镜像的推送
shell
# 【搜索相关镜像文件 】: docker search xx
# 【拉取镜像文件】 : docker pull xx
# 【拉取指定版本的镜像文件】 : docker pull xx:5.7
# 【查看镜像 】docker images
# 【查看镜像Id所有】 docker images -q
# 【查看镜像 筛选后的 】: docker images | grep java | awk '{print $3}'
# 【删除镜像】 : docker rmi 镜像
# 【组合配合删除未运行的镜像】 : docker rmi $(docker images -q)
# 【组合配合删除指定名字的镜像】 : docker rmi $(docker images | grep 'xxx' | awk '{print $3}')
# 【镜像打包】docker save -o xx文件.tar xx镜像
# 【镜像载入】docker load -i xx文件.tar
# 【构建镜像】docker build -t <tag名称> -f <dockefile文件> .
# 【推送镜像】docker push tag名称
docker容器相关命令
docker ps
: 查看容器docker rm
: 删除容器
shell
# 【查看已经起着的容器】:docker ps
# 【查看未运行的容器】: docker ps -a
# 【查看单独只是容器Id】: docker ps -q
# 【删除容器】 : docker rm 容器 带上-v顺带删除数据卷
# 【组合配合删除所有容器】 :docker rm $(docekr ps -a -q)
docker运行容器
docker run
: 运行docker容器-p
: 指定端口-d
: 后台运行容器,并返回容器ID--name
: 指定容器名称-e
: 设置环境变量-v
: 设置文件映射--restart=always/unless-stopped
: 重启方式--rm
: 停止后会自动删除容器--network
: 网络--network-alias
: 网络别名--command
: 运行命令--volumes-from
: 指定使用数据卷轴
docker start/stop/restart
: 容器的启动/关闭/重启docker update
: 修改配置docker exec
: 进入容器终端 (-it 分配终端使用有效)docker cp
: 复制文件
bash
docker run --name 名称 -p 88:80 -v 映射文件 -d xx镜像名称
docker stop xx
docker restart xx
docker update --restart = always(no)
docker exec [options] 名称/Id Command [args]
docker exec -it xx bash
docker exec -it xx /bin/bash
docker exec -it xx /bin/sh
# 【复制文件【宿主和容器】】
1.docker cp /路径一 容器名:/路径二
2.docker cp 容器名:/路径一 /路径二
docker 查看资源信息
docker logs
: 查看日志docker inspect
: 查看容器信息docker port
: 查看容器的绑定和监听信息docker stats
: 查看容器资源在宿主机上使用情况docker top
: 查看容器内服务资源使用情况docker system
: 查看docker信息
bash
# 【看日志】 :docker logs 你的容器
docker logs 你的容器 --tail 100 -f (指定查看容器的服务运行状态)
# 【查看容器所有信息】 : docker inspect 你的容器
# 【查看容器端口的绑定和监听情况】 : docker port 你的容器
# 【查看容器资源在宿主机上使用情况】 : docker stats | grep 你的容器
# 【查看容器内服务资源使用情况】 : docker top 你的容器
# 【查看docker占用空间】 : docker system df
# 【查看docker信息】: docker system info
docker网络配置
添加容器访问外网: --add-host=host.docker.internal:host-gateway
docker network ls
: 查看网络docker network create
: 创建网络docker network disconnect
: 解绑网络docker network connect
: 绑定网络docker network rm
: 删除网络
css
#【查看网络】 : docker network ls
#【创建自定义network】 : docker network create --driver bridge
--subnet 172.18.0.0/16 --gateway 172.18.0.1 mynet
--driver bridge 网络模式为 桥接模式
--subnet 172.18.0.0/16 设置子网
--gateway 172.18.0.1 设置网关
--mynet 自定义的network名
#【连接指定的网络启动】 : docker run -it --name <容器名> ---network <要加入的局域网网络名>
--network-alias <网络的别名> <最后写上的镜像名>
#【解绑容器网络】 : docker network disconnect <网络名> <容器名>
#【绑定容器网络】 : docker network connect <网络名> <容器名>
#【删除网络】: docker network rm <网络名> [...<网络名>]
#【查看网络信息】 :docker network inspect <网络名>
#【快速查看所有网络使用了的】: docker network inspect $(docker network ls -q) --format '{{.Name}}: {{range .IPAM.Config}}{{.Subnet}}{{end}}'
docker 数据卷
docker volume ls
: 查看数据卷列表docker volume create
: 创建数据卷docker volume rm
: 删除数据卷docker volmue inspect
: 查看数据卷
bash
# 【列出docker数据卷】 : docker volume ls
# 【创建volume】: docker volume create vol_name
# 【删除volume】: docker volume rm vol_name
# 【查看volume】: docker volume inspect vol_name
案例:构建发布的过程
例如springboot
项目,我们打包好对应的jar
包,然后在指定的目录下放置dockerfile
文件,然后通过命令构建镜像文件,然后推送到指定的镜像仓库中即可。
bash
FROM java:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
#相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行
WORKDIR /app
#将targer目录下的jar包复制到docker容器/目录下面
ADD demo-1.0.0.jar demo.jar
# 容器提供默认的执行命令
CMD ["java","-jar","demo.jar","&"]
使用我们上述的提到过的命令形式
bash
# 【构建镜像】docker build -t <tag名称> -f <dockefile文件> .
# 【推送镜像】docker push tag名称
注意 .
的位置是指的在dockfile
文件同个层级下,执行的命令
docker 优化
配置CPU和内存
对于启动容器应用需要指定CPU和内存大小时,可以在启动时候配置对应的参数
-m 512m
: 设定内存大小--cpus=2
: 设定cpu核数目大小
scss
#【设置内存】 docker run -m 512m [container/id]
// 表明最大可以512,但当宿主机内存吃紧,会回收到256.
#【设置内存的软性限制】 docker run -m 512m --memory-reservation=256m [container/id]
#【设置cpu个数】 docker run --cpus=2 [container/id]
清理对应的数据
查看docker容器中占用磁盘较大的文件,升序: du -d1 -h /var/lib/docker/containers | sort -h
docker container prune
: 删除所有已经停止的容器docker volume prune
: 删除不再使用的数据卷docker image prune
:删除悬挂状态的镜像(不会在被使用的镜像)docker system prune
: 清理容器,镜像等数据docker builder prune
: 清除未使用的构建缓存docker network prune
: 清除所有未使用到的网络
如果针对需要一些定时清理的场景,或者是相关的配置约定,可以参考有关自动清理的相关配置
json
1. 自动清理镜像和容器,设置过期时间
{
"image-prune-filters": {
"until": "24h"
},
"container-prune-filters": {
"until": "24h"
}
}
2.设置日志的最大的大小,和日志保留时间
{
"log-opts": {
"max-size": "100m",
"max-file": "10"
}
}
docker-compose 命令
常用的指定: -f 指定文件,-p定义名称 , -d 后台运行
docker-compose管理命令
- 运行:
docker-compose up
- 构建:
docker-compose build
- 停止:
docker-compose down
- 删除:
docker-compose rm
- 日志:
docker-compose logs
(ps:所有容器服务日志)
对应的服务管理
- 服务运行不存在:
docker-compose up -d {service}
- 服务运行已存在:
docker-compose start {service}
- 服务停止不删除:
docker-compose stop {service}
- 服务重启:
docker-compose restart {service}
- 服务删除:
docker-compose rm {service}
- 获取日志:
docker-compose logs {service}
shell
# 【检查docker-compose.yml 执行的样子】docker-compose -f xxx配置文件 config
# 【构建镜像images】 docker-compose -f xxx配置文件 build [--no--cache]
# 【后台运行 (-f 指定文件,-p定义名称 , -d 后台运行)】:
docker-compose -f xx配置文件路径 up -d
# 【运行某个指定的服务】 docker-compose -f xx配置文件路径 up -d <服务名>
# 【停止】 : docker-compose -f 指定文件 down
# 【获取由Compose管理的容器的状态信息 】: docker-compose -f 指定文件 ps
# 【启动已经存在 】: docker-compose -f 指定文件 start <服务名>
# 【停止,但不删除】 : docker-compose -f 指定文件 stop <服务名>
# 【删除已停止的容器 -v删除数据券 】: docker-compose -f 指定文件 rm <服务名>
# 【停止并删除容器,网络,镜像】docker-compose down (-v 删除卷)
# 【获取日志】 : docker-compose -f 指定文件 logs
# 【重启某个服务 , -t 等待时间(s)再kill】 : docker-compose -f 指定文件 restart -t 30 <服务名>
docker-compose.yml的配置信息
注意: 在同一个network里,可以通过service直接访问另一个service ,也可以通过网络别名。也可以访问全局唯一的container_name
version
: 使用compose的版本services
: 指定服务 eg:mysql (可以在本文件里唯一)restart
:指定重启策略 (always , unless-stopped)build
: 指定Dockerfile所在文件夹的路径。Compose将会利用Dockerfile自动构建镜像,然后使用镜像启动服务容器context
: 指定路径dockerfile
: 指定dockerfile的名称
image
: 指定镜像container_name
:指定容器名称 (在全局的docker环境里唯一)ports
: 指定端口映射条件environment
: 指定相关参数配置voulmes
: 指定数据卷的映射depends_on
:指定多个服务的依赖关系顺序- <服务名称>
condition
: 【需要配合healthcheck 】指定条件(service_healthy
(服务通过健康检查且处于健康状态时才会启动应用服务)|service_started
|service_completed_successfully
)
- <服务名称>
dockerfile
:指定额外的编译镜像 dockerfile文件command
: 用于指定容器启动时运行的命令 (优先级高于dockfile内部的CMD)eg: ["echo", "Hello, Docker Compose!"]links
: 可以直接通过记录ip在容器,后面可以用别名替代ipnetworks
: 使用的网络- <网络名称>
aliases
: 网络别名
- <网络名称>
healthcheck
: 健康检查test
:健康检查命令 ["CMD-SHELL", "mysqladmin ping --silent"]interval
: 健康检查之间的间隔时间。这里设置为每 10 秒进行一次检查timeout
: 每次健康检查的超时时间。这里设置为 5 秒retries
: 失败重试次数。在标记容器为不健康之前允许的失败次数。这里设置为 5 次。当连续失败指定次数后,容器状态会变成unhealthystart_period
: 开始检查前的等待时间。这里设置为 30 秒,给 xxx 一些时间来启动并准备好接受连接
auth_config
: 配置验证信息username
账号password
密码serveraddress
镜像地址
networks
: 配置网络 docker-compose 网络- <指定网络名称>
driver
:指定链接, host, bridgeipam
: 配置ip地址管理 docker-compose配置子网和网关subnet
:子网gateway
: 网关
external
: true 说明该网络是由外部创建的,不是docker compose创建的
- <指定网络名称>
volumes
: 配置数据卷 docker-compose 使用命名卷轴- <指定数据卷的名称>
external
: true 说明该卷已经由外部创建好了
- <指定数据卷的名称>
案例模版:指定镜像运行 (image)
docker-compose.yml 的文件编写
ruby
version: '3'
services:
mysql: #指定容器名称
restart: always # 代表知道docker 启动那么这个容器就跟着一起启动
image: daocloud.io/library/mysql:5.7.4 #指定镜像
container_name: mysql # 指定镜像名称
ports:
- 3306:3306 # 指定端口号的映射
envirmonment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=latelee
- MYSQL_PASSWORD=123456
voulmes:
- /opt/docker/mysql/data:/var/lib/mysql # 指定映射的数据卷
启动指定docker-compose.yml文件运行
bash
docker-compose -f docker-compose.yml -p test up -d
案例一:使用网络
- 手动通过命令创建的网络
arduino
# network docker network create --driver bridge <网络名>
然后在compose.yml文件中指定网络名,申明external
为true,最后对应的服务商引用下改网络名即可
vbnet
version: '3'
networks:
<网络名>:
external: true
-
如果是不存在的网络,需要自动创建的。就不要标记
external
为true,最后对应的服务商引用下改网络名即可 -
如果需要指定网络的网关和子网掩码的配置,对当前的整个compose服务的网络管理起来
yaml
# 设置网络
networks:
<网络名>:
driver: bridge # 方式
ipam:
config:
- subnet: 192.168.100.0/24 # 24标识二进制有个24个1,剩余8个0,等同于255.255.255.0
- gateway: 192.168.100.1
再在具体的服务上指定具体的ip地址,例如下述的yy服务指定了ip地址
yaml
# 服务绑定网络
services:
yy:
image: xx
networks:
<网络名>:
ipv4_address: 192.168.100.11 # 配置每个服务具体的ip地址
注意: 不同的docker - compose
项目对应的子网不能重复,这是为了确保容器网络的正常运行和 IP 地址的唯一性,避免网络冲突
- 还有一种场景:对应我们需要启动的服务需要访问自己的宿主机的时候,需要配置为
host.docker.internal
当作宿主机的ip地址来访问
案例二:使用环境变量文件.env
当我们在 docker-compose.yml
文件中引用了大量的环境变量时,此时我们可以通过 .env
文件来为 docker-compose.yml
文件引用的所有环境变量设置默认值!通过在yml中使用${}
引用变量,env中确认配置值。
编写docker-compose.yml
文件
yaml
version: '3'
services:
web:
image: ${IMAGETAG} // 通过$ 引用变量
environment:
APPNAME:
AUTHOR:
VERSION:
ports:
- "5000:5000"
redis:
image: "redis:alpine"
编写.env
文件
ini
# define env var default value.
IMAGETAG=defaultwebimage
APPNAME=default app name
AUTHOR=default author name
VERSION=default version is 1.0
案例三: 依赖dockerfile运行
使用自定义dockfile
文件来构建docker
镜像,指定build
的内容位置 ,等同于docker
命令的build
的实现,只不过就是把这个步骤放在文件中编排起来了
首先我们定义docker-compose.yml
文件的实现,指定context
文件dockerfile
的文件夹目录,dockerfile
参数为 dockerfile
文件名称
yaml
version: "3.0"
services:
demo: #项目id
build: #启动服务时,先将build中指定的dockerfile打包成镜像,再运行该镜像
context: ./dir #指定上下文目录dockerfile所在目录[相对、绝对路径都可以]
dockerfile: Dockerfile #文件名称[在指定的context的目录下指定那个Dockerfile文件名称]
container_name: test
ports:
- "8881:8881"
然后在指定dockerfile内容
bash
FROM java:8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/locatime
#用来指定当前工作目录(或者称为当前目录) 当使用相对目录的情况下,采用上一个WORKDIR指定的目录作为基准
#相当与cd 命令,但不同的是指定了WORKDIR后,容器启动时执行的命令会在该目录下执行
WORKDIR /app
#将targer目录下的jar包复制到docker容器/目录下面
ADD demo-1.0.0.jar demo.jar
# 容器提供默认的执行命令
CMD ["java","-jar","demo.jar","&"]
最后通过命令执行即可
bash
docker-compose -f docker-compose.yml -p test up -d
Dockfile文件关键词
COPY
复制文件(推荐使用的复制) : 源路径 ,目标路径ADD
更高级的复制文件: 如(解压缩文件)源路径, 目标路径CMD
: 容器启动命令- shell格式: CMD <命令>
- exec格式(推荐使用): CMD ["可执行文件", "参数1", "参数2"...]
ENTRYPOINT
: 入口点 同CMD作用- 接收上层传递下来的参数加入到CMD命令中, eg:(docker run xx -i ,-i会传递到CMD参数上)
- 应用运行前的准备工作 ,先执行文件预先操作 eg:(
ENTRYPOINT ["docker-entrypoint.sh"]
)
ENV
: 设置环境变量(运行时)- 通过$引用变量
ARG
: 构建参数(也是环境变量,构建时)- 配合使用再
docker build
的传递,dockerfile使用环境变量(注意: ARG 指令有生效范围,如果在FROM
指令之前指定,那么只能用于FROM
指令中) - 命令docker build
--build-arg
xx=yyy来指定参数 指定arg参数 (构建用
- 配合使用再
VOLUME
: 定义匿名卷 , 数据保存在卷中EXPOSE
: 声明端口- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
WORKDIR
: 指定工作目录RUN
:在新镜像内部执行的命令(每个RUN
指令都会在当前镜像的基础上创建一个新的镜像层)
相关Dockfile的功能参考
引入jdk
官方的 OpenJDK,此镜像以 Alpine Linux
为基础,体积小巧,适合生产环境,对应的安装工具是apk
sql
引入jdk8 :FROM openjdk:8-jdk-alpine
引入jdk17 :FROM openjdk:17-jdk-alpine
如果需要使用 Debian
或 Ubuntu
这类更完整的基础系统 ,后续针对安装工具是apt-get
sql
引入jdk8 :FROM openjdk:8-jdk
引入jdk17 :FROM openjdk:17-jdk
设置时区
对于镜像系统内的时区可以通过手动指定 , 如Asia/Shanghai
bash
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
增加阿里的仓库源
将 Alpine Linux
系统默认的软件包镜像源替换为阿里云的镜像源,以加快软件包的下载速度和提高下载的稳定性
bash
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
后续通过更新或者安装软件包就比较快一些
csharp
# 更新软件包索引并安装一个示例软件包
RUN apk update && apk add curl
安装中文字体 & 删除安装缓存包
如果代码中有用到字体绘制相关功能则需要添加安装字体
bash
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*
java启动命令
CMD
或者 ENTRYPOINT
执行 . 可以直接通过 java -jar
,或者通过 sh -c
来执行
less
CMD ["java", "-jar", "-Xms256m", "app.jar"]
ENTRYPOINT ["java","-jar","app.jar"]
// "sh", "-c" : 可通过exec模式执行shell => 获得环境变量
ENTRYPOINT ["sh", "-c", "java -Xms512M -Xmx512M -D -jar app.jar"]
Dockfile的模版案例
基础模板
提供一个dockfile的编写的参考案例如下所示
bash
FROM openjdk:8-jdk-alpine
# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app/
COPY target/app.jar /app/app.jar
CMD ["java", "-jar", "-Xms512m", "app.jar"]
调整项目的进程为1的问题
csharp
# 运行tini
RUN apk add --no-cache tini
# 运行jar包
ENTRYPOINT ["tini", "java", "-jar", "/tutorial.jar", "&"]
指定arg参数 (构建用)
对于dockfile文件中有些内容为占位符内容,通过构建build
命令带参数传递进去。
bash
# dockerfile 中
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
构建的时候用到的变量 docker build --build-arg JAR_FILE="$javaFile" ...
指定ENV环境变量(运行用)
通过dockfile中指定环境变量,可以通过docker启动命令能直接去修改替换掉它,不加就是默认dockfile中的值
bash
# dockerfile 中
ENV JAVA_OPTS="xxxx"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS ..."]
启动命令 docker run -e "JAVA_OPTS=yyyy" ...