Docker环境搭建
安装docker
官网安装文档:https://docs.docker.com/install/linux/docker-ce/centos/
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.reposudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginsudo systemctl start dockersudo systemctl enable docker
docker配置
docker重写命令
# 修改/root/.bashrc文件
vi /root/.bashrc内容如下:
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fisource /root/.bashrc
docker追加命令
docker update --restart=always mycontainer
docker远程访问
编辑宿主机文件
vim /usr/lib/systemd/system/docker.service
在[service]中的 ExecStart配置最后面添加该配置
-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
重新加载系统管理守护进程的配置文件
systemctl daemon-reload
sudo systemctl stop docker
sudo systemctl start docker
idea插件docker连接:tcp://192.168.56.10:2375
证书配置:
docker网络
https://docs.docker.com/engine/reference/commandline/network/
docker network create | 创建一个网络 |
---|---|
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
# 1.首先通过命令创建一个网络
docker network create hmall# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 hmall bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了hmall以外,其它都是默认的网络# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
命令快速搭建
命令 | 说明 |
---|---|
docker pull | 拉取镜像 |
docker push | 推送镜像到DockerRegistry |
docker images | 查看本地镜像 |
docker rmi | 删除本地镜像 |
docker run | 创建并运行容器(不能重复创建) |
docker stop | 停止指定容器 |
docker start | 启动指定容器 |
docker restart | 重新启动容器 |
docker rm | 删除指定容器 |
docker ps | 查看容器 |
docker logs | 查看容器运行日志 |
docker exec | 进入容器 |
docker save | 保存镜像到本地压缩文件 |
docker load | 加载本地压缩文件到镜像 |
docker inspect | 查看容器详细信息 |
mysql
# 拉取镜像
docker pull mysql:8.0.30# 创建容器
docker run -d --name mysql8 -p 3307:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --restart=always --privileged=true -e MYSQL_ROOT_PASSWORD=11111111 mysql:8.0.30
docker安装完成mysql8,如果使用sqlyog或者navite连接,需要修改密码加密规则,因为低版本客户端工具不支持mysql8最新的加密规则。如果使用客户端连接,需要修改:
-
docker exec 进入mysql容器
-
mysql -uroot -p 登录你的 MySQL 数据库,然后 执行这条SQL:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '11111111';
然后再重新配置SQLyog的连接,重新填写密码,则可连接成功了。
redis
#1 拉取镜像
docker pull redis:7.0.10#2 在宿主机的 /var/lib/docker/volumes/redis-config/_data/目录下创建一个redis的配置文件,
vim redis.conf
# 内容如下所示
#开启持久化
appendonly yes
port 6379
# 设置密码
requirepass 11111111
bind 0.0.0.0#3 如果/var/lib/docker/volumes没有redis-config,创建数据卷
docker volume create redis-config#4 创建容器
docker run -d -p 6380:6379 --restart=always \
-v redis-config:/etc/redis/config \
-v redis-data:/data \
--requirepass 11111111 \
--name redis7 redis:7.0.10 \
redis-server /etc/redis/config/redis.conf临时设置密码
docker exec -it my-redis redis-cli
CONFIG SET requirepass 11111111
mongdb
minio
//拉取镜像
docker pull quay.io/minio/minio// 创建数据存储目录
mkdir -p ~/minio/data// 创建minio
docker run \-p 9000:9000 \-p 9090:9090 \--name minio \-v ~/minio/data:/data \-e "MINIO_ROOT_USER=minioadmin" \-e "MINIO_ROOT_PASSWORD=minioadmin" \-d \quay.io/minio/minio server /data --console-address ":9090"
gitlab
# 拉取
docker pull gitlab/gitlab-cedocker run \-it \--detach \--privileged=true \--hostname 192.168.56.10 \--publish 4443:443 --publish 9980:80 --publish 5022:22 \--name gitlab \--restart always \--volume /data/docker/gitlab/etc:/etc/gitlab \--volume /data/docker/gitlab/log:/var/log/gitlab \--volume /data/docker/gitlab/data:/var/opt/gitlab \gitlab/gitlab-ce:latestdocker exec -it gitlab cat /etc/gitlab/initial_root_password
ftp
docker run -d -v /root/ftp:/home/vsftpd \
-p 60020:20 -p 60021:21 -p 61100-61105:61100-61105 \
-e FTP_USER=1 -e FTP_PASS=11111111 \
-e PASV_ADDRESS=1.2.3.4 -e PASV_MIN_PORT=61100 -e PASV_MAX_PORT=61105 \
-e PASV_ADDRESS=192.168.56.10 \
--name vsftpd --restart=always fauria/vsftpd
ftp://192.168.56.10:60021
nginx
#拉取镜像
docker pull nginx:latest#运行nginx镜像
docker run -d -p 87:80 \
--name nginx-lecizx \
-v nginx_html:/usr/share/nginx/html \
-v nginx_conf:/etc/nginx/ \
-v nginx_logs:/var/log/nginx nginx:# nginx-spzx容器的管理命令
docker start nginx-lecizx # 启动容器
docker stop nginx-lecizx # 关闭容器
docker rm nginx-lecizx # 删除容器
nacos
nacos
nacos
# 拉取镜像
docker pull nacos/nacos-server:v2.2.2# 创建容器
docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d --restart=always nacos/nacos-server:v2.2.2# nacos2.x的版本新增了一个客户端与服务端的gRpc的通讯端口号9848
http://192.168.56.10:8848/nacos
custom.env
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim
Jpom
Jpom项目运维
docker volume create jpom-server-data
docker volume create jpom-server-logs
docker volume create jpom-server-confdocker run -d -p 2122:2122 \
--name jpom-server \
--restart=always \
-v /etc/localtime:/etc/localtime:ro \
-v jpom-server-data:/usr/local/jpom-server/data \
-v jpom-server-logs:/usr/local/jpom-server/logs \
-v jpom-server-conf:/usr/local/jpom-server/conf \
jpomdocker/jpom
http://192.168.56.10:2122
seata
docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.56.10 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network lecizx \
-d \
seataio/seata-server:1.5.2
dockerfile构建
https://docs.docker.com/engine/reference/builder/
指令 | 说明 |
---|---|
FROM | 指定基础镜像 |
ENV | 设置环境变量,可在后面指令使用 |
COPY | 拷贝本地文件到镜像的指定目录 |
RUN | 执行Linux的shell命令,一般是安装过程的命令 |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 |
部署java项目
# 1.构建项目镜像,不指定tag,则默认为latest
docker buid -t <imagesName> 本地目录路径(存放Dockerfile文件)
docker build -t hmall .# 2.查看镜像
docker images
# 结果
REPOSITORY TAG IMAGE ID CREATED SIZE
hmall latest 0bb07b2c34b9 43 seconds ago 362MB
docker-demo 1.0 49743484da68 24 hours ago 327MB
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB# 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmall --network hmall -p 8080:8080 hmall
dockerfile
# 基础镜像,拷贝已有的java11
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包 打包好的项目
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
dockerCompose
安装docker-compose
pip install docker-compose
Compose Build Specification | Docker Docs
Overview of docker compose CLI | Docker Docs
docker compose [OPTIONS] [COMMAND]
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
-p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |
docker compose ui
spring boot项目部署
1.创建项目目录,存放需要部署的文件
2.编写docker-compose.yml文件
2.docker compose up -d 命令后台,构建镜像,创建容器,并启动容器
mysql+nginx+spring boot
docker-compose.yml
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall
# 1.进入root目录
cd /root# 2.删除旧容器
docker rm -f $(docker ps -qa)# 3.删除hmall镜像
docker rmi hmall# 4.清空MySQL数据
rm -rf mysql/data# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 358B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s=> [internal] load build context 0.0s=> => transferring context: 98B 0.0s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s=> CACHED [3/3] COPY hm-service.jar /app.jar 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4✔ Network hmall Created 0.2s✔ Container mysql Started 0.5s✔ Container hmall Started 0.9s✔ Container nginx Started 1.5s# 6.查看镜像
docker compose images
# 结果
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB# 7.查看容器
docker compose ps
# 结果
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s…" mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.…" nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp# 8.删除容器
docker compose down
redis集群
docker-compose.yaml
network_mode:主机模式,直接与宿主机进行交互
version: "3.2"services:r1:image: rediscontainer_name: r1network_mode: "host"entrypoint: ["redis-server", "--port", "7001"]r2:image: rediscontainer_name: r2network_mode: "host"entrypoint: ["redis-server", "--port", "7002"]r3:image: rediscontainer_name: r3network_mode: "host"entrypoint: ["redis-server", "--port", "7003"]
构建redis集群
docker compose up -d# 进入容器配置从节点
# 连接r2
docker exec -it r2 redis-cli -p 7002
# 认r1主,也就是7001
slaveof 192.168.56.10 7001# 查询当前redis的主从关系以及配置信息
info replication