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
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 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: 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:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
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:
- hmall
networks:
- 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: 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
# 認r1主,也就是7001
slaveof 192.168.56.10 7001
# 查詢當前redis的主從關係以及配置資訊
info replication