1. 卸載docker
- 查看是否安裝了docker
yum list | grep docker
- 卸載老版本docker,拷貝自官網
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
- 卸載新版本
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. 安裝
- 阿里的源好像不能用,這是清華的源
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+http://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 啟動docker
sudo systemctl start docker
- 停止docker
sudo systemctl stop docker
- 設置docker為自啟動
sudo systemctl enable --now docker
3. 配置倉庫
- 如果沒有daemon.json 文件,創建文件
vim /etc/docker/daemon.json
- 配置
# 寫入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.1ms.run"]
}
EOF
- 重啟docker
# 重啟docker服務
systemctl daemon-reload && sudo systemctl restart docker
5. 鏡像與容器的常用命令
操作類型 | 命令 | 說明 |
---|---|---|
鏡像操作 | docker pull [鏡像名稱]:[標簽] | 拉取指定鏡像,若不指定標簽,默認拉取latest 標簽鏡像 |
docker images | 列出本地已有的鏡像 | |
docker rmi [鏡像ID或鏡像名稱:標簽] | 刪除指定的鏡像,支持鏡像ID或鏡像名稱+標簽 | |
容器操作 | docker run [選項] [鏡像名稱] [命令] | 創建并運行容器,-itd 表示交互、終端、后臺運行;--name 可指定容器名稱 |
docker ps | 列出當前正在運行的容器 | |
docker ps -a | 列出所有容器,包括已停止的容器 | |
docker inspect [容器ID或容器名稱] | 查看容器詳情 | |
docker exec -it [容器ID或容器名稱] /bin/bash | 進入正在運行的容器并執行指定命令,常搭配/bin/bash 進入容器終端 | |
docker stop [容器ID或容器名稱] | 停止指定的容器 | |
docker start [容器ID或容器名稱] | 啟動已停止的容器 | |
docker rm [容器ID或容器名稱] | 刪除指定容器,若容器在運行需先停止;docker rm -f [容器ID或容器名稱] 可強制刪除 | |
docker rm $(docker ps -aq) | 刪除所有未運行的容器 |
- 創建并運行容器
-d:后臺運行
–name:起別名,如果不指定,會隨機生成別名
-p 81:80:端口映射
tomcat后面沒有跟標簽,默認啟動latest
docker run -d --name=mytomcat2 -p 6001:8080 tomcat
docker run -d --name=mynginx1 -p 81:80 nginx
- 從容器構建鏡像并提交到倉庫
- 和ghost系統差不多
# 1. 查看正在運行的容器列表,獲取目標容器的CONTAINER IDdocker ps# 2. 提交容器為鏡像(格式:docker commit [容器ID] [鏡像名稱:標簽]),這里的容器是自己修改過后的docker commit your-container-id your-image-name:latest# 3. 為鏡像添加倉庫標簽(格式:docker tag [本地鏡像] [倉庫地址/鏡像名稱:標簽])docker tag your-image-name:latest your-username/your-repo:v1.0# 4. 登錄Docker倉庫(首次推送需要登錄)docker login# 5. 推送鏡像到倉庫(格式:docker push [倉庫地址/鏡像名稱:標簽])docker push your-username/your-repo:v1.0
6. 數據卷
- 宿主機目錄不存在,容器內目錄存在 :啟動容器進行掛載時,Docker 會在宿主機上創建對應的目錄,并將容器內該目錄下的所有文件和子目錄復制到宿主機新建的目錄中。
- 宿主機目錄存在,容器內目錄存在 :掛載時,容器內目錄會被宿主機目錄的內容覆蓋。
- 我理解就是給容器內的文件或目錄做一個硬連接,連接到宿主機的某個目錄或文件,以達到數據持久化的目的
1. 在啟動容器時綁定掛載
特點: 允許將宿主機任意目錄或文件掛載到容器中,靈活性高。
- 這里省略了run命令的很多其他參數,例如:-p、-d
docker run -v [宿主機路徑]:[容器內路徑]:[權限] 鏡像名 [命令]
示例:
- 掛載目錄
docker run -v /home/user/data:/app/data -it ubuntu bash
- 掛載文件
docker run -v /home/user/config.txt:/app/config.txt -it ubuntu bash
2. 命名數據卷
特點: 創建容器時顯式指定名稱的數據卷。方便管理和識別,即使容器刪除,也可通過名稱訪問、管理數據卷。
命令 | 說明 |
---|---|
docker volume create [數據卷名稱] | 創建一個新的數據卷 |
docker volume ls | 列出所有已創建的數據卷 |
docker volume rm [數據卷名稱] | 刪除指定的數據卷 |
- 創建數據卷
默認會在:/var/lib/docker/volumes/ 下創建my_volume目錄
docker volume create my_volume
- 將其掛載到容器內的 /app/data 目錄
docker run -v my_volume:/app/data -it ubuntu bash
7. 常用軟件
- mysql
- 綁定掛載
docker run -itd \-p 33061:3306 \-v /root/mysql/conf:/etc/mysql/conf.d \-v /root/mysql/data:/var/lib/mysql \--name='mysql' \-e MYSQL_ROOT_PASSWORD=123456 \-e TZ=Asia/Shanghai \mysql:8.4 \--lower_case_table_names=1
解釋
docker run
:用于運行容器的命令。-itd
:-i
表示交互式操作,-t
為容器分配偽終端,-d
使容器在后臺運行。-p 33061:3306
:將宿主機 33061 端口映射到容器內 3306 端口,方便從外部訪問容器內 MySQL 服務。-v /root/mysql/conf:/etc/mysql/conf.d
:把宿主機/root/mysql/conf
目錄掛載到容器內/etc/mysql/conf.d
目錄,用于存放 MySQL 配置文件。-v /root/mysql/data:/var/lib/mysql
:將宿主機/root/mysql/data
目錄掛載到容器內/var/lib/mysql
目錄,保存數據庫數據。--name='mysql'
:為容器命名為mysql
,方便后續管理和識別。-e MYSQL_ROOT_PASSWORD=123456
:設置容器內 MySQL 的 root 用戶密碼為123456
,創建mysql容器必須的。-e TZ=Asia/Shanghai \
:設置時區mysql:8.4
:指定使用的 MySQL 鏡像及版本為 8.4 。--lower_case_table_names=1
:傳遞給 MySQL 服務的啟動參數,設置表名不區分大小寫,linux中嚴格區分大小寫,所以設置不區分。
- 命名掛載
- 創建命名數據卷
docker volume create mysql_conf_volume
docker volume create mysql_data_volume
- 啟動MySQL容器并掛載命名數據卷
docker run -itd \-p 33062:3306 \-v mysql_conf_volume:/etc/mysql/conf.d \-v mysql_data_volume:/var/lib/mysql \--name='mysql1' \-e MYSQL_ROOT_PASSWORD=123456 \mysql:8.4 \--lower_case_table_names=1
- tomcat
docker run -itd \--name=tomcat_8001 \-v /root/tomcat/8001:/usr/local/tomcat/webapps \-p 8001:8080 \tomcat:10.0-jdk17
- nginx
先隨便創建一個nginx的容器,并拷貝3個文件夾,拷貝后就刪除這個容器
# 配置文件
docker cp nginx:/etc/nginx /root/nginx/conf
# 日志
docker cp nginx:/var/log/nginx /root/nginx/log
# 項目目錄
docker cp nginx:/usr/share/nginx/html /root/nginx/html
docker run -itd \-p 81:80 \-v /root/nginx/conf/nginx:/etc/nginx \-v /root/nginx/log:/var/log/nginx \-v /root/nginx/html:/usr/share/nginx/html \--name=nginx_81 \nginx
-v /root/nginx/conf/nginx:/etc/nginx \
:第一步拷貝出來的是一個名為nginx的目錄,里面是配置文件,可以到/root/nginx/conf/nginx中查看一下
8. Dockerfile
命令 | 說明 |
---|---|
docker build -t [鏡像名稱]:[標簽] . | 在包含Dockerfile 的目錄下,根據Dockerfile 構建鏡像,. 表示當前目錄 |
通過Dockerfile構建自己的鏡像,文件內容像是將手動構建的過程轉成代碼
- 構建tomcat
# 基于centos鏡像構建一個新的鏡像
FROM centos:7
# 標記作者
LABEL author="zhaoyun"
# 把當前目錄下的文件復制到容器的/user/local目錄下
# ADD和COPY都可以復制文件,ADD兼有解壓tar包的功能
ADD jdk-17.0.15_linux-aarch64_bin.tar.gz /usr/local
ADD apache-tomcat-10.1.40.tar.gz /usr/local
# 修改解壓后目錄的名字
RUN mv /usr/local/jdk-17.0.15 /usr/local/jdk
RUN mv /usr/local/apache-tomcat-10.1.40 /usr/local/tomcat
# 聲明變量
ENV JAVA_HOME=/usr/local/jdk
ENV CATALINA_HOME=/usr/local/tomcat
# 聲明環境變量
ENV CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH=$JAVA_HOME:$CATALINA_HOME/bin:$CATALINA_HOME/lib:$PATH
# 指定工作目錄(docker exec -it 進入容器后的目錄)
WORKDIR /usr/local/tomcat
# 暴露端口
EXPOSE 8080
# 啟動tomcat
CMD ["catalina.sh","run"]
執行構建指令
docker build -t mytomcat:10.1 .
運行鏡像,在瀏覽器的8010端口就可以使用了
docker run -itd --name=tomcat10.1 -p 8010:8080 mytomcat:10.1
-
docker build -t mytomcat:10.1 .
:注意最后的.
,意思就是Dockerfile在當前目錄下;構建的鏡像名:mytomcat,標簽:10.1 -
注意這兩句代碼
ADD jdk-17.0.15_linux-aarch64_bin.tar.gz /usr/local
、RUN mv /usr/local/jdk-17.0.15 /usr/local/jdk
,ADD是將tar包解壓到local目錄中,RUN中運行的是更改目錄名字的命令,jdk的tar包解壓后的名字不是:jdk-17.0.15_linux-aarch64_bin
。tar包解壓后的名字是什么需要自己解壓看一下,RUN中的命令執行不了改名會報錯 -
目錄結構:
兩個目錄不是必須得,這里是解壓了兩個tao包看解壓后名字的。
- 在idea中構建鏡像
編輯Dockerfile文件
# OpenJDK 17 鏡像作為基礎鏡像
FROM openjdk:17
# 創建工作目錄
RUN mkdir -p /root/app
# 設置工作目錄,后續操作都在該目錄下進行
WORKDIR /root/app# 將當前目錄下的 target 目錄中的 jar 包復制到容器內的 /app 目錄下
# 請將 your_application.jar 替換為實際的 JAR 包名稱
COPY ./jar/hello.jar /root/app/app.jar# 暴露容器運行時的端口,根據實際 JAR 應用監聽的端口修改
EXPOSE 8080# 定義容器啟動時執行的命令,用于運行 JAR 包并指定配置文件位置
CMD ["java", "-jar", "/root/app/app.jar"]
- 這里的配置比上一個tomcat的配置簡單好多,因為tomcat是以centos為基礎鏡像,需要配置Path等環境變量,這里是以jdk為基礎鏡像,在基礎鏡像中已經配置好了環境變量,在本鏡像中直接使用就可以了
9. 網絡
命令 | 說明 |
---|---|
docker network create [網絡名稱] | 創建一個新的Docker網絡 |
docker network ls | 列出所有已創建的Docker網絡 |
docker network connect [網絡名稱] [容器ID或容器名稱] | 將指定容器連接到指定網絡 |
dock的網絡模式共有4種,這里介紹兩種常用的模式
- 默認情況
- 橋接網絡(bridge)
- 原理:這是 Docker 默認的網絡驅動。當你創建一個新容器時,若不指定網絡模式,它會自動連接到橋接網絡。Docker 會創建一個名為 docker0 的虛擬網橋,容器通過虛擬網卡連接到該網橋,實現容器之間以及容器與宿主機的通信。
- 特點:容器有獨立的 IP 地址,可通過 IP 相互訪問。不過,橋接網絡是隔離的,不同的橋接網絡之間默認無法直接通信。
通俗理解,Docker在啟動時會創建一個類似路由器的東西,名為docker0,地址:172.17.0.1,每開一個容器,Docker會給容器分配一個ip地址,例如:172.17.0.2、172.17.0.3,可以通過docker inspect [容器名或ID]
查看,容器直接可以通過此網絡互相訪問
- 將多個容器劃分成一組,類似給網絡劃分vlan
- 容器之間可以通過自定義的名字互相訪問
- 創建自定義橋接網絡
docker network create my_custom_network
此命令會創建一個名為 my_custom_network
的自定義橋接網絡。
-
將容器連接到自定義網絡
創建容器時,通過--network
參數指定要連接的網絡。 -
示例:啟動多個容器并連接到自定義網絡
# 啟動一個 MySQL 容器并連接到自定義網絡
docker run -d --name mysql_container --network my_custom_network -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0# 啟動一個應用容器并連接到自定義網絡
docker run -d --name app_container --network my_custom_network my_app_image
在上述示例中,mysql_container
是 MySQL 數據庫容器,app_container
是應用程序容器,它們都連接到了 my_custom_network
網絡。
容器間的訪問方式
- 通過容器名稱訪問
在自定義網絡中,容器能夠使用其他容器的名稱作為主機名來進行訪問。這是因為 Docker 會自動為每個容器創建 DNS 記錄,使得容器間可以通過名稱解析 IP 地址。
示例:應用容器訪問 MySQL 容器
假設 app_container
是一個需要連接 MySQL 數據庫的應用程序,它可以使用 mysql_container
作為主機名來連接數據庫。以下是在 app_container
內使用命令行工具連接 MySQL 的示例:
docker exec -it app_container mysql -h mysql_container -u root -p123456
在應用程序代碼里,配置數據庫連接時也可以使用容器名稱:
import mysql.connectormydb = mysql.connector.connect(host="mysql_container",user="root",password="123456",database="your_database"
)# 執行數據庫操作
- 通過 IP 地址訪問
你也可以通過查看容器的 IP 地址,然后使用 IP 地址進行訪問。
查看容器 IP 地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql_container
上述命令會輸出 mysql_container
的 IP 地址。
使用 IP 地址訪問
docker exec -it app_container mysql -h <mysql_container_ip> -u root -p123456
將 <mysql_container_ip>
替換為實際的 IP 地址。