快速上手之docker

leci_bokeyuan發表於2024-05-06

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



相關文章