快速上手之docker
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-engine
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
docker配置
docker重写命令
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias 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
fi
source /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-ce
docker 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:latest
docker 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
docker volume create jpom-server-data
docker volume create jpom-server-logs
docker volume create jpom-server-conf
docker 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 lecizx .
# 2.查看镜像
docker images
# 结果
REPOSITORY TAG IMAGE ID CREATED SIZE
lecizx 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将其加入lecizx网络,这样才能通过容器名访问mysql
docker run -d --name lecizx --network lecizx -p 8080:8080 lecizx
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 lecizx-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: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- lecizx
lecizx:
build:
context: .
dockerfile: Dockerfile
container_name: lecizx
ports:
- "8080:8080"
networks:
- lecizx
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- lecizx
networks:
- lecizx
networks:
lecizx:
name: lecizx
# 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
# 6.查看镜像
docker compose images
# 7.查看容器
docker compose ps
# 8.删除容器
docker compose down
redis集群
docker-compose.yaml
network_mode:主机模式,直接与宿主机进行交互
version: "3.2"
services:
r1:
image: redis
container_name: r1
network_mode: "host"
entrypoint: ["redis-server", "--port", "7001"]
r2:
image: redis
container_name: r2
network_mode: "host"
entrypoint: ["redis-server", "--port", "7002"]
r3:
image: redis
container_name: r3
network_mode: "host"
entrypoint: ["redis-server", "--port", "7003"]
构建redis集群
docker compose up -d
# 进入容器配置从节点
# 连接容器r2
docker exec -it r2 redis-cli -p 7002
# 设置端口7001 r1为主节点
slaveof 192.168.56.10 7001
# 查询当前redis的主从关系以及配置信息
info replication
# 退出容器
exit
# 连接容器r3
docker exec -it r3 redis-cli -p 7003
# 设置端口7001 r1为主节点
slaveof 192.168.56.10 7001
# 测试redis集群
注:现在只能在r1上执行写操作
# 在r1上设置键值
set test01 test01
# 在r2,r3上获取参数值
get test02
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律