参考文档
Docker学习文档
环境
- 服务器 CentOS Linux release 7.9.2009
- Docker 24.0.7
- 后端 java
- 前端 vue3
- 数据库 mysql 5.7.31
- Nginx 1.20.1
- redis
linux服务器
yum更新
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
命令
firewall-cmd --zone=public --add-port=80/tcp --permanent // 防火墙开放80端口
Docker
安装
// 安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
// 启动docker
systemctl start docker
配置
修改安装源
mkdir -p /etc/docker
vi /etc/docker/daemon.json // 进入编辑并写入下面内容
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
docker命令行
systemctl daemon-reload // 重新加载文件
systemctl restart docker // 重启docker
systemctl enable docker // 开机自启
镜像命令行
docker images // 查看镜像
docker rmi <image-name> // 删除镜像
docker build -t <image-name> . // 制作镜像
容器命令行
docker ps // 查看正在运行docker容器
docker ps -a // 查看所有容器
docker run -p 8080(宿主端口):80(容器端口) -d -v 主机路径:容器路径 nginx(容器名称) // 运行容器nginx并映射文件
docker restart <容器name> // 重启容器
docker stop <容器name> // 关闭容器
docker rm <容器name> // 删除容器
docker rm -f <容器name> // 删除正在运行容器
docker-compose down -v //命令清除Docker的缓存。这个命令会删除未使用的镜像、容器以及网络等资源
docker exec -it <mysql_container_id> mysql -u <username> -p <password> < <path_to_sql_file> // 执行命令
docker exec -it <容器name> /bin/bash // 进入到容器环境
exit // 退出容器环境内
docker update --restart=unless-stopped <container_name> // 设置容器开机自动重启
// 复制文件
docker cp 容器名:容器文件路径 主机路径 // 后面路径是要复制到的目标路径
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf // 示例
docker logs --tail 50 <container_id> // 查看输出日志
docker inspect <container_name> // 检查容器配置
docker build -t myimage . // 打包镜像,'.'表示参数'PATH'命令将从当前目录读取构建上下文,即包含 Dockerfile 的同级目录
Dockerfile
# 使用官方Nginx镜像作为基础镜像
FROM nginx:latest
# 将宿主机上的nginx.conf复制到容器内的/etc/nginx/nginx.conf
COPY /home/nginx/conf/nginx.conf /etc/nginx/nginx.conf
# 暴露容器的80端口
EXPOSE 80
# 启动容器时自动运行Nginx服务
CMD ["nginx", "-g", "daemon off;"]
`FROM`:指定基础镜像,后续的指令将基于这个基础镜像进行构建。
`RUN`:在构建过程中执行命令。
`ADD`:将文件或目录添加到镜像中。
`COPY`:将文件或目录从宿主机复制到容器中。
`ENV`:设置环境变量。
`EXPOSE`:指定容器中的端口。
`CMD`:指定容器启动时执行的命令。
`ENTRYPOINT`:指定容器启动时执行的命令,与`CMD`不同的是,`ENTRYPOINT`不会被`docker run`命令覆盖。
`USER`:指定执行后续命令的用户。
`WORKDIR`:指定工作目录。
`VOLUME`:定义容器数据卷
`ONBUILD`:当构建一个被继承的DockerFile时运行命令
`MAINTAINER`:指定维护者信息
打包镜像
docker build [OPTIONS] PATH
docker build -t myimage . // demo '.'表示参数'PATH'命令将从当前目录读取构建上下文,即包含 Dockerfile 的同级目录
# 参数说明
`OPTIONS` 是可选的参数,`PATH` 是指定构建上下文的路径。
下面是一些常用的 `docker build` 命令选项:
- `-f`或`--file`:指定构建镜像的 Dockerfile 文件名。
- `-t`或`--tag`:为生成的镜像指定一个标签。
- `-q`或`--quiet`:以静默模式运行构建过程,减少输出。
- `-m`或`--memory`:设置构建过程使用的内存限制。
- `--build-arg`:传递构建时的参数给 Dockerfile。
- `--cache-from`:从指定的镜像中提取缓存。
- `--no-cache`:禁用构建缓存
Nginx
文档
安装
docker pull nginx:latest
运行容器
docker run -p 8080:80 --name nginx-8080 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf/conf.d:/etc/nginx/conf.d -v /home/nginx/log:/var/log/nginx -v /home/nginx/html:/etc/nginx/html -d nginx:latest
# 直接复制,会包含'换行符'运行可能出错,建议复制上面'单行'命令
docker run \
-p 9002:80 \
--name nginx \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /home/nginx/log:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
-d nginx:latest

后端java
添加Dockerfile 文件
- 在 jar 包的同一级文件夹下新建 Dockerfile 文件,文件内容如下
FROM java:8
VOLUME /tmp
ADD authority.jar authority.jar
EXPOSE 8888
ENTRYPOINT ["java","-jar","/authority.jar"]
生成镜像
docker build -t authority . // 后面'.'代表
运行容器
docker run -d -p 8888:8888 --name java-8888 authority
mysql
安装
docker pull mysql:5.7.31
运行容器
docker run -d --name mysql-3306 -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31
# 参数解析
- -d: 后台运行容器,并返回容器 ID
- –name myMysql: 为容器指定一个名称
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -v: 绑定一个卷,容器的 /var/lib/mysql 映射到 主机的目录 /data/mysql
- -e MYSQL_ROOT_PASSWORD=123456: 设置环境变量,密码设置为 123456
mysql:5.7.31:使用镜像 mysql:5.7.31
测试连接
docker exec -it <容器name> mysql -u root -p // 进入到myqsl环境
redis
文档
安装
docker pull redis
创建redis配置文件
// 宿主路径 /home/redis/conf/redis.conf
// 对应容器路径 /etc/redis/redis.conf
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
bind 127.0.0.1
#是否开启保护模式,默认开启。要是配置里没有指定bind和密码。
#开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no
protected-mode no
#redis监听的端口号
port 6379
#此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。
#当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
#在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p
tcp-backlog 511
#此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0
timeout 10000
#tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。
#检测到对端关闭需要两倍的设置值
tcp-keepalive 300
#是否在后台执行,yes:后台运行;no:不是后台运行
daemonize yes
#redis的进程文件(容器内需要建立对应路径,报错建议注释掉使用默认)
# pidfile /var/run/redis/redis.pid
#指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
loglevel notice
#指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null(容器内需要建立对应路径,报错建议注释掉使用默认)
# logfile /usr/local/redis/var/redis.log
#是否打开记录syslog功能
# syslog-enabled no
#syslog的标识符。
# syslog-ident redis
#日志的来源、设备
# syslog-facility local0
#数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始
databases 16
启动容器
docker run -d -p 6379:6379 -v /home/redis/data:/data -v /home/redis/conf/redis.conf:/etc/redis/redis.conf --name redis-6379 redis
测试
docker exec -it redis-6379 /bin/bash // 进入容器内部
redis-cli
ping
// 显示PONG 成功
遇到问题
- 容器内配置nginx反向代理不生效
- 容器内不能使用localhost和127.0.0.1地址,要使用宿主的ip地址
- 后端打包生成容器后,出现下面不能访问服务情况的错误
curl: (56) Recv failure: Connection reset by peer
- redis提示连接不上
- 修改redis相关配置文件,建议直接使用上面提供配置文件测试