?Docker-Compose
1、Docker Desktop
在Windows上安裝Docker服務,可以使用Docker Desktop這個應用程序。
下載并安裝這樣的一個安裝包
安裝好后:執行命令?
docker --version
從Docker Hub提取hello-world映像并運行一個容器:
docker run hello-world
這行命令會讓docker從官方倉庫中拉去hello-world的鏡像到本地,并且自動將其實例化成容器
標簽 | 含義 |
---|---|
REPOSITORY | 鏡像所在的倉庫名稱 |
TAG | 鏡像標簽 |
IMAGEID | 鏡像ID |
CREATED | 鏡像的創建日期(不是獲取該鏡像的日期) |
SIZE | 鏡像大小 |
Docker?Desktop?dashboard是docker的UI工具
2、鏡像源修改設置
"registry-mirrors": ["https://8y2y8njn.mirror.aliyuncs.com"]
docker 的鏡像源持續更新地址 :
國內能用的Docker鏡像源【2025最新持續更新】_docker 鏡像-CSDN博客
3、Docker-Compose
Docker-Compose是Docker公司推出的一個工具軟件,負責實現對Docker容器集群的快速編排。
Docker Compose和Docker版本對應關系:Compose file version 3 reference | Docker Docs
Docker Compose下載,下載這樣的一個文件
docker-compose --version
4、docker-compose.yml
docker-compose.yml
Docker-Compose的工程配置文件默認為docker-compose.yml,可通過環境變量COMPOSE_FILE或-f參數自定義配置文件,其定義了多個有依賴關系的服務及每個服務運行的容器。?
Compose允許用戶通過一個單獨的docker-compose.yml模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project)
使用docker-compose前提情況,需要創建一個文件名為docker-compose.yml的文件。
version: '3'services:tomcat:restart: alwaysimage: tomcatcontainer_name: tomcatports:- 8080:8080volumes:- d://docker/tomcat/webapps:/usr/local/tomcat/webapps- d://docker/tomcat/logs:/usr/local/tomcat/logsenvironment:TZ: Asia/Shanghai
version:’3’ :表示compose對docker版本的支持,這里是compose版本,并非是docker版本。
services: 表示一個該配置文件的所有容器實例,支持配置多個容器實例。
tomcat:表示是一個多個容器中的其中一個
restart: always:表示該容器實例是隨著機器啟動而啟動。
image: tomcat:表示本容器使用的鏡像是tomcat,如需要指定版本號則 image: tomcat:8.0。
container_name: tomcat:表示容器的一個別名。
ports:表示容器端口映射到宿主機端口。
volumes:表示dockers容器的數據卷,將容器實例的目錄映射到宿主機上盤符目錄。
environment:表示容器環境的設置,我這里配置的是tomcat容器的時區時間為亞洲/上海。
后臺啟動配置中創建的容器:docker-compose up -d
停止配置中創建的容器:docker-compose stop
刪除配置中創建的容器:docker-compose down
docker-compose config -q #檢查配置,有問題才有輸出
docker-compose logs yml里面的服務id? #查看容器輸出日志
Dockerfile構建鏡像
1、Dockerfile
之前我們獲得鏡像,都是從Docker倉庫中進行下載,接下來我們自己使用Dockerfile開發一個鏡像
Dockerfile其實就是一個文本文件,由一系列命令和參數構成,Docker可以讀取Dockerfile文件并根據Dockerfile文件的描述來構建鏡像。
1、每個保留關鍵字(指令)都是必須是大寫字母
2、執行從上到下順序執行
3、#表示注釋
4、每一個指令都會創建提交一個新的鏡像層,并提交!舉例如下:
#依賴的基礎鏡像名稱和ID FROM centos:7 #指定鏡像創建者信息 MAINTAINER atguigu #切換工作目錄 WORKDIR /usr RUN mkdir /usr/local/java #ADD 是相對路徑jar,把java添加到容器中 ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/ #配置java環境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_144 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH
鏡像分層:好處是可以共享一些基礎的層(基礎鏡像BaseImage)
添加安裝包、依賴、配置等,每次操作都形成新的一層
2、Dockerfile構建指令
命令 | 作用 |
FROM image_name:tag | 定義了使用哪個基礎鏡像啟動構建流程 |
MAINTAINER user_name | 聲明鏡像的創建者 |
ENV key value | 在容器內部設置環境變量 (可以寫多條) |
RUN command | 執行shell命令、一般是安裝過程的命令 |
ADD source_dir/file dest_dir/file | 將宿主機的文件復制到容器內,如果是一個壓縮文件,將會在復制后自動解壓 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有壓縮文件并不能解壓 |
WORKDIR path_dir | 設置工作目錄 |
EXPOSE:容器運行時監聽的特定網絡端口。
VOLUME:為容器創建掛載點或聲明卷
ADD:將文件、目錄或遠程URL復制到鏡像中。
ENTRYPOINT:鏡像中應用的啟動命令,容器運行時調用
Run指令
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:
FROM centos RUN?yum?-y?install?wget RUN?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN?tar?-xvf?redis.tar.gz
以上執行會創建 3 層鏡像。可簡化為以下格式:
FROM centos RUN?yum?-y?install?wget?\&&?wget?-O?redis.tar.gz?"http://download.redis.io/releases/redis-5.0.3.tar.gz"?\&&?tar?-xvf?redis.tar.gz
如上,以?&&?符號連接命令,這樣執行后,只會創建 1 層鏡像。
上傳jar包構建鏡像
1、構建思路
半自動化思路:springboot還是打包成普通的jar,然后把這個jar上傳到服務器,同時在服務器創建一個Dockerfile文件,執行docker build命令,把這個jar構建成一個docker鏡像,然后通過鏡像執行。
2、上傳jar包和Dockerfile
上傳jar包和Dockerfile文件到ubuntu服務器上,我是上傳到了myapp/hello-word這個目錄
Dockerfile文件內容如下:
# java8環境鏡像
FROM java:8
# 將宿主機的文件復制到容器內,可以重命名
ADD helloworld-0.0.1-SNAPSHOT.jar helloworld.jar
# 聲明啟動端口號
EXPOSE 8089
# 配置容器啟動后執行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]
3、docker build 鏡像構建
在Dockerfile所在目錄,執行命令構建鏡像
注意后邊的空格和點,不要省略
docker build -t myhelloworld .
-t ?是給鏡像起名,格式依然是repository:tag的格式,不指定tag時,默認為latest
. ? 是指定Dockerfile所在目錄,如果就在當前目錄則指定為"."
查看鏡像是否創建完成
docker?images
maven插件構建鏡像
1、構建思路
半自動化思路:springboot pom.xml中配置maven插件支持,打包時會使用項目里面的dockerfile,如果沒配置插件支持會報錯找不到dockerfile文件
2、dockerfile-maven-plugin
dockerfile-maven-plugin是一個maven的插件,主要作用是在項目構建的時候生成基于項目的docker鏡像文件。
dockerfile-maven-plugin的目標就是將maven的打包過程和docker的build過程結合在一起,當成功打包,既生成了對應的jar,也已生成了對應的docker鏡像。
3、第一 步: pom文件引入
第一步:在pom中增加對dockerfile-maven-plugin插件的引用,核心代碼如下:
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><configuration><dockerfile>Dockerfile</dockerfile><repository>${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><jarFile>${project.build.finalName}.jar</jarFile></buildArgs></configuration></plugin></plugins></build>
4、第二步:Dockerfile文件
在項目根目錄(和pom文件在同一級)新建一個Dokerfile文件,文件內容如下:
# java8環境鏡像
FROM java:8
# 將宿主機的文件復制到容器內,可以重命名
ADD target/${JAR_FILE} helloworld.jar
# 聲明啟動端口號
EXPOSE 8089
# 配置容器啟動后執行的命令
ENTRYPOINT ["java","-jar","helloworld.jar"]
說明: Maven 生成的 JAR 文件在 target/ 目錄中
5、第三步:DockerDesktop
在使用dockerfile-maven-plugin打包docker鏡像的時候,必須啟動DockerDesktop。
dockerfile-maven-plugin 本質上是調用本機的 Docker CLI 命令(如 docker build)來構建鏡像,而 Docker CLI 需要與 Docker 守護進程(dockerd)通信才能完成鏡像構建任務。
Docker Desktop 在 Windows/macOS 上提供了 Docker 守護進程(dockerd)和必要的運行時環境。
6、第四步:dockerfile:build
打開 IDEA 右側的 Maven 面板。
展開當前項目 → Plugins → dockerfile。
雙擊 dockerfile:build 目標,等待構建完成。
構建完成后,有2處變化,
第一是在docker desktop中多了鏡像
第二是在target目錄下多了一個
Docker應用部署舉例
1、Portainer
在云服務器上部署 Docker,并安裝 Portainer 運維面板以及漢化。
Portainer是一個可視化的Docker操作界面,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操作(包括上傳下載鏡像,創建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用戶管理和控制等功能。功能十分全面,基本能滿足中小型單位對容器管理的全部需求。
1、查詢鏡像
docker search portainer
2、拉取鏡像
docker pull portainer/portainer
3、創建卷
docker volume create portainer_data
4、創建容器
創建之前我們可以先創建個文件夾存放容器的相關數據(做本地映射)
mkdir -p ?/home/docker/volume/data/
然后執行容器創建的命令:
docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
訪問Portainer系統
瀏覽器打開:http://portainer_IP:9000
ps:建議使用谷歌、火狐等瀏覽器打開。
3. 設置管理員
2、部署mysql
企業穩定版,5.5---5.7---8.0。本次?5.7?為準
select version();
1.查看mysql鏡像
docker search mysql
2.拉取mysql鏡像
docker pull mysql:5.7
3.創建mysql容器
docker run -d -p 3306:3306 --privileged=true -v /zzyyuse/mysql/log:/var/log/mysql -v /zzyyuse/mysql/data:/var/lib/mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7
大體分為3部分
?-p 代表端口映射,格式為 宿主機映射端口:容器運行端口
--privileged=true 放開權限
-v 掛載容器數據卷
? ? 容器卷:防止docker容器壞了,未雨綢繆
? ? 掛載在linux主機:docker容器之間,進行有效的數據維護和安全保障-e 代表添加環境變量
MYSQL_ROOT_PASSWORD 是root用戶遠程登陸密碼創建守護式容器?
4.啟動mysql容器,在windows上遠程登錄mysql
登錄進去的界面
5.進入mysql容器查看字符編碼,密碼是設置的123456
docker exec -it 235fc9cb98de bash
show variables like 'character%';? ? ??查看字符編碼
6.解決一個docker容器mysql實例的中文亂碼問題
通過修改linux,可以同步給docker(因為用V設置了目錄掛載)
[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
------------------------------------
重新啟動mysql容器,進入容器,查看編碼
docker restart mysql
3、部署tomcat
1.拉取鏡像
docker pull tomcat:7-jre7
2.創建容器
# 創建tomcat容器;并掛載了webapps目錄
docker run -di --name=mytomcat -p 9000:8080?-v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
3.測試
在映射的宿主機目錄/usr/local/webapps下創建如下:
- mkdir docker
- touch /docker/index.html
瀏覽器訪問測試
4、部署nginx
1.拉取鏡像
docker?pull nginx
2. 創建容器????????
docker run -di --name=mynginx -p 80:80 nginx
3.測試
在瀏覽器
5、部署redis
1.拉取鏡像
docker?pull redis
2.創建容器
docker run -di --name=myredis -p 6379:6379 redis
3.測試
使用redis客戶端,連接redis,經測試成功連接上
Docker遷移與備份
這里又有很多命令復制過去不對,但是用手打一遍就好使了,我懷疑是中文空格的原因吧
1、docker commit 將容器保存為鏡像
docker commit 容器名稱 ?鏡像名稱
例如:docker commit mynginx mynginx_i
2、docker save 將鏡像備份為tar文件(就可以移動到別的服務器)
# 命令形式:docker save –o tar文件名 鏡像名
# 保存鏡像為文件 -o:表示output 輸出的意思
docker save -o mynginx.tar mynginx_i
3、docker load 根據tar文件恢復為鏡像
# 命令形式:docker load?-i tar文件名
docker load?-i mynginx.tar注意:直接刪除?mynginx_i?鏡像 ,發現會報錯,因為當前鏡像的容器正在運行,需要先停止容器,刪除容器 , 在刪除鏡像。
Docker私有倉庫
私有倉庫搭建與配置
- 1.1?拉取私有倉庫鏡像
docker pull registry
- 1.2?啟動私有倉庫容器
docker run -di --name=registry -p 5000:5000 registry
- 1.3?打開瀏覽器 輸入地址?http://192.168.2.108:5000/v2/_catalog?看到{"repositories":[]}?表示私有倉庫搭建成功并且內容為空
- 1.4?修改daemon.json
vim?/etc/docker/daemon.json"insecure-registries":["192.168.2.108:5000"] #改行目的是讓容器信任該地址
systemctl?restart docker #重啟docker服務【這里還必須要重啟,光??systemctl daemon-? ? ? reload 不行】
鏡像上傳至私有倉庫
2.1標記此鏡像為私有倉庫的鏡像
# 標記鏡像為私有倉庫的鏡像 ?
# docker tag jdk1.8 宿主機IP:5000/jdk1.8
docker tag jdk1.8 192.168.2.108:5000/jdk1.8
2.2啟動私服容器
# 再次啟動私有倉庫容器 ?
docker start registry
2.3上傳標記的鏡像
# 上傳標記的鏡像 ?
# docker push 宿主機IP:5000/jdk1.8
docker push 192.168.2.108:5000/jdk1.8
2.4測試
重新刷新,發現jdk 1.8 已經上傳到私服
從私有倉庫拉取鏡像
# 執行拉取鏡像命令并查看
docker pull 192.168.2.108:5000/jdk1.8
docker images