1.概述
1.1介紹
Docker 是一個開源的應用容器引擎, 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。也就是說會將所有需要的內容放到不同的集裝箱中,誰需要這些環境就直接拿這個集裝箱。具有隔離性,即在運行集裝箱內的內容時,會在Linux的內核中, 單獨的開辟一片空間, 這片空間不會影響到其他程序。
容器是完全使用沙箱機制,
1.2相關術語
注冊中心:超級碼頭, 上面放的就是集裝箱
鏡像:相當於集裝箱
容器:運行起來的鏡像
2.下載與安裝
2.1docker安裝
1)下載關於docker的依賴環境
yum -y install yum-utils device-mapper-persistent-data lvm2
2)設置下載docker的鏡像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3)安裝docker
yum makecache fast yum -y install docker-ce
4)啟動
systemctl start docker
5)測試
docker run hello-world
6)設置開機啟動
systemctl enable docker
7)安裝完成,測試結果,看到下圖說明安裝成功
8)查看版本
docker -v
9)停止、重啟
systemctl stop docker
systemctl restart docker
10)查看docker的狀態
systemctl status docker
2.2中央倉庫
國外的倉庫訪問很慢,我們使用國內的倉庫http://hub.daocloud.io/
打開網址,搜索需要的容器,如tomcat
點擊搜索的內容
選擇版本后點擊拉取
復制拉取命令,后面可以直接使用
3.鏡像的操作
鏡像id(鏡像標識)也叫IMAGE ID,如果鏡像id中前面一部分是唯一的,則可以使用其直接代替整個id。后面的容器id也是類似。實例如下:
可以看到只有兩個鏡像,對於tomcat鏡像,就可以直接使用b8來代替b8dfe9ade316 ,顯得非常簡單。
3.1基本操作命令
1)拉取鏡像到本地
命令語法:
docker pull tag
實例:拉取tomcat鏡像到本地
docker pull daocloud.io/library/tomcat:8.5.15-jre8
2)查看本地全部的鏡像
ducker images
3)刪除本地鏡像
命令語法:
docker rmi 鏡像標識
實例:
docker rmi b8
4)鏡像的導出
命令語法:
docker save -o 導出的路徑 鏡像id
實例:
docker save -o ./tomcat8.5.image b8
5)加載導出的鏡像
命令語法:
docker load -i 鏡像路徑
實例:
docker load -i tomcat8.5.image
6)修改鏡像的名稱和tag
命令語法:
docker tag 鏡像id 容器名稱:版本
實例:
docker tag b8 tomcat:8.5
8)運行容器
命令簡單語法:
docker run -d -p 宿主服務端口:容器端口 --name 容器名稱 鏡像標識或名稱
參數分析:
-d:服務后台運行 -p 宿主服務端口:容器端口:指定映射端口。即linux對外暴露的端口:執行的容器的端口 --name 容器名稱:指定容器的名稱
實例1:
docker run -d -p 9001:8080 --name tomcat b8
實例2:
docker run -d -p 9001:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
兩個實例,運行一個即可。啟動后,在瀏覽器通過ip:9001來訪問tomcat。這里tomcat的默認端口是8080,在指定容器的端口時也必須是8080,否則外部無法訪問。tomcat是指定容器啟動后的名字,是自定義是,不能重復。
實例3:
docker run tomcat
上面的兩個實例是在初始化容器,指定了一些參數,而實例3是直接啟動,已經啟動過並停止的容器,可以使用這種方式。而且上面兩個實例都是在后台運行的,還有一種方式不在后台運行
docker run --rm -p 80:80 nginx:2.0
運行容器,關閉運行后會自動刪除此容器。
9)查看正在運行的容器
docker ps
可以看到下圖的信息,也標注了哪個是容器id
查看所有的容器
docker ps -a
10)停止容器的運行
命令語法:
docker stop 容器id
11)重啟容器
命令語法:
docker start 容器id
12)查看容器的執行日志
命令語法:
docker logs -f 容器id
13)進入容器內部
命令語法:
docker exec -it 容器id bash
14)刪除容器
命令語法:
docker rm 容器id
需要注意的是,刪除之前,必須先停止容器的執行。刪除之后,再次執行運行容器的命令來啟動容器。
15)查看版本信息
docker version
16)查看docker的詳細信息
docker info
3.2安裝其他的鏡像
以下直接使用一行命令拉取並啟動容器。
3.2.1把項目部署到tomcat
1)先把項目打成war上傳到linux中
2)啟動tomcat容器(如果已經啟動則不操作)
3)把宿主機的文件復制到容器中
命令語法:
docker cp 文件名稱 容器id:存到容器的內部路徑
實例:
docker cp test.war 222a:/usr/local/tomact/webapps
3.2.2安裝mysql
mysql容器啟動時需要添加額外的參數,來指明mysql服務的登錄名和密碼。
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 daocloud.io/library/mysql:5.7.6
安裝之后就可以使用連接工具進行連接測試。
3.3 dcoker run參數詳解
在啟動鏡像時,帶了很多的參數,下面對常用的進行說明 :
參數名稱 | 說明 | 樣例 |
-d | 后台啟動此容器 | |
-p | 端口映射,宿主服務端口:容器端口 | 8080:8080 |
--name | 指定啟動的容器的名稱,自定義 | tomcat |
-e | 設置環境變量 | MYSQL_ROOT_PASSWORD=123456 |
-v | 目錄映射,宿主服務目錄:容器目錄 | /opt/tomcat/webapps:/usr/local/tomcat/webapps |
4.數據卷
4.1介紹
數據卷就是把宿主機的目錄與容器的某一個目錄進行映射。容器中的文件操作起來比較麻煩,就直接操作宿主機的文件,容器可以動態的使用這些文件。
4.2操作
1)創建數據卷
創建的數據卷默認存放在/var/lib/docker/volumes/目錄下。
命令語法:
docker volume create 數據卷名稱
實例:
docker volume create test
2)查看數據卷詳細信息
命令語法:
docker volume inspect 數據卷名稱
實例:
docker volume inspect test
3)查看全部的數據卷
docker volume ls
4)刪除數據卷
命令語法:
docker volume rm 數據卷名稱
實例:
docker volume rm test
5)映射數據卷
第一種:
命令語法:
docker run -v 數據卷名稱:容器內部映射的路徑 鏡像id
實例:
docker run -v tomcat:/usr/local/tomcat/webapps b8
可以看到webapps下的文件已經復制到指定的數據卷
這種方式直接映射數據卷時,如果數據卷不存在,Docker 會自動創建,將容器內部自帶的文件存儲在默認的存放路徑中。
第二種:
命令語法:
docker run -v 路徑:容器內部映射的路徑 鏡像id
實例:
docker run -v /usr/bk:/usr/local/tomcat/webapps b8
映射后里面是空的
在映射時直接指定一個路徑作為數據卷的存放位置,映射后這個文件夾是空的。
5.Docker-Compose
5.1介紹
解決運行鏡像輸入大量參數的問題,批量管理容器。只需要配置docker-compose.yml即可。
5.2下載與安裝
1)下載
下載地址:https://github.com/docker/compose/releases/tag/1.24.1,也可以使用其他的版本。
2)把下載的文件復制到linux的/usr/local/bin目錄下
3)修改其名稱並給與操作權限
mv docker-compose-Linux-x86_64 docker-compose chmod 777 docker-compose
4)添加環境變量,可全局使用
vi /etc/profile #在尾部追加 export PATH=$PATH:/usr/local/bin
#刷新 source /etc/profile
5)測試
在任意目錄下輸入
docker-compose
看到下圖說明安裝成功。
5.3基本配置
只需要在其目錄下創建一個docker-compose.yml文件,然后輸入相關配置即可。
一般會把映射的文件放在/opt目錄下,因此先在/opt目錄下新建一個文件夾,存放配置文件和其他文件
cd /opt mkdir docker_mysql_tomcat cd docker_mysql_tomcat touch docker-compose.yml
docker-compose.yml中mysql和tomcat的配置如下,其他容器同:
version: '3.1' services: #服務的名字 mysql: #只要docker,此容器也啟動 restart: always #指定鏡像路徑 image: daocloud.io/library/mysql:5.7.6 #設置容器名稱 container_name: mysql #設置端口號映射 ports: - 3306:3306 environment: #設置服務登錄的密碼 MYSQL_ROOT_PASSWORD: 123456 #設置時區 TZ: Asia/Shanghai tomcat: restart: always image: daocloud.io/library/tomcat:8.5.15-jre8 container_name: tomcat ports: - 9001:8080 environment: TZ: Asia/Shanghai volumes: - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs
在上述的配置中,environment中使用的是key: value方式,其實也可以使用列表(-和=)方式,關鍵代碼如下:
environment: #設置服務登錄的密碼 - MYSQL_ROOT_PASSWORD=123456 #設置時區 - TZ=Asia/Shanghai
這兩種方式都是可以的,可以相互替換。也就是說,對於凡是可以使用列表方式的地方,都可以使用key: value方式;對於凡是可以使用key: value方式的地方,都可以使用列表方式。可根據自己的想法選擇。不過需要注意的是,使用key: value方式是,在冒號后面與value直角必須留一個空格。
5.4操作命令
1)啟動管理的容器,需要在對應的yml目錄中運行
docker-compose up -d
2)關閉並刪除管理的容器
docker-compose down
3)開啟(關閉stop、重啟restart)已管理的容器
docker-compose start
4)查看由docker-compose管理的容器
docker-compose ps
5)查看日志
yml配置后在/opt/docker_mysql_tomcat目錄執行上面的啟動命令,就可以同時啟動這兩個容器,也是可以訪問的。
6.自定義鏡像Dockerfile
6.1介紹
在前面介紹了中央倉庫,里面的鏡像其實也有docker用戶自己上傳的,我們也可以自定義鏡像。常用的命令如下,具體使用見后面:
命令 | 說明 |
from | 指定鏡像要依賴的環境,如tomcat |
env | 設置環境變量(可設置多條) |
run | 要執行的命令(可設置多條) |
add | 把宿主機的文件復制到容器內容,如果是壓縮文件會自動解壓 |
copy | 同add,但是壓縮文件不會自動解壓 |
workdir | 設置工作目錄 |
6.2使用Dockerfile自定義鏡像
1)先創建一個目錄,存放Dockerfile文件
cd /opt mkdir dockerfile
2)把自己的war包放到這個目錄下
我的war可以下載后使用,鏈接:https://pan.baidu.com/s/1Nn17bKJeaxAspfQN_wAKig 提取碼:1235
3)創建Dockerfile文件,內容如下
FROM daocloud.io/library/tomcat:8.5.15-jre8 RUN rm -rf /usr/local/tomcat/webapps/* ADD springboot.war /usr/local/tomcat/webapps
上面的命令分析:從倉庫中使用tomcat鏡像,然后刪除webapps下面的文件,把war包放到webapps下。
4)生成鏡像
docker build -t springboot:1.0 .
springboot:1.0指定自定義鏡像的名稱和版本號,點表示war包和Dockerfile文件是在同一目錄下。
5)啟動鏡像
docker run -d -p 8080:8080 --name springboot 33
6)測試
在瀏覽器之間訪問對應的路徑,這里是http://192.168.101.33:8080/springboot/api/user,可以看到返回的正常數據。
6.3結合docker-compose自定義鏡像
1)結合上一步的操作,在/opt/dockerfile目錄下新建docker-compose.yml,內容如下
version: '3.1' services: #服務的名字 springboot: #只要docker,此容器也啟動 restart: always #構建自定義鏡像 build: #設置dockerfile的路徑 context: . #指定dockerfile的名稱 dockerfile: Dockerfile #指定鏡像路徑,這里使用自己的鏡像 image: springboot:2.0 #設置容器名稱 container_name: springboot #設置端口號映射 ports: - 8080:8080 environment: #設置時區 TZ: Asia/Shanghai
其中version是指定docker-compose的版本。
2)使用docker-compose啟動容器。如果上一步的鏡像沒有停止,請先停止后再啟動。
docker-compose up -d
如果需要重新構建自定義鏡像,可使用下面的命令
docker-compose build
7.安裝Jenkins
7.1介紹
7.2安裝與運行
1)在/opt目錄下新建一個文件夾,映射jenkins
mkdir docker_jenkins
2)配置docker-compose.yml
version: '3.1' services: jenkins: restart: always image: jenkins/jenkins container_name: jenkins ports: - 8888:8080
- 5000:5000 volumes: - ./data:/var/jenkins_home
3)啟動運行,等待文件下載完成,查看日志發現data文件夾沒有授權
docker-compose up -d
docker-compose logs -f
4)給data權限,然后再次運行后查看日志
chmod 777 data
docker-compose restart
看到下圖說明運行成功
5)在瀏覽器訪問http://192.168.1.161:8888即可看到jenkins在初始化網絡,然后在登錄頁面輸入上圖中的密碼
6)點擊選擇插件來安裝
7)搜索安裝必要的插件,這里安裝git和publish
選擇好后點擊安裝,會安裝插件,這個過程需要一段時間,網絡良好的話兩個小時左右,
8)創建管理員賬戶
9)配置實例頁面不用選擇,直接下一步即可
10)進入首頁,如下圖
7.3配置
7.3.1配置docker集群
1)安裝插件
打開系統管理->插件管理,選擇可選插件后在搜索框輸入docker
選擇后進行安裝,安裝完成后需重啟jenkins,同理需要安裝SSH、Locale、Version Number和Maven插件。SSH是后面連接docker要用到的,Locale是中文插件,把語言切換為中文,Version Number。安裝完成后需重啟jenkins。
2)開啟docker的2375端口,用於遠程訪問
打開docker的配置文件,添加參數
vi /usr/lib/systemd/system/docker.service
參數配置如圖
可復制的參數
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
配置后保存,重啟docker
systemctl daemon-reload systemctl restart docker
3)配置dcoker集群
打開系統管理->系統配置,找到下圖的地方,點擊
選擇docker詳情
配置docker,點擊測試,測試成功會顯示版本號等信息。
7.3.2配置全局的jdk和maven
第一步:把jdk和maven的壓縮包上傳到linux,然后把文件都解壓到/opt/docker_jenkins/data目錄下,這個目錄和/var/jenkins_home是映射關系(7.2中配置的)。
第二步:打開系統管理->全局工具配置,分別點擊jdk安裝和maven安裝來配置jdk和maven,配置如下圖
7.3.3添加憑據
由於后面要用到虛擬機,就先添加一個虛擬機的憑證。方法是在系統管理中,找到下圖的安全憑證,
進去之后點擊全局后面的三角,
添加一個憑證
保存后在系統配置中配置SSH遠程主機信息,配置后點擊連接進行測試。
8.jenkins+docker實現SpringBoot項目自動化部署
8.1項目准備
新建一個springboot的項目,這是使用springboot-test來創建項目,但是指定的打包名是springboot(詳見源碼https://github.com/zhongyushi-git/springboot-test.git),寫一個簡單的測試接口。然后在項目的根目錄下新建一個Dockerfile的文件,內容如下
#設置tomcat鏡像 FROM daocloud.io/library/tomcat:8.5.15-jre8 #刪除webapps下面之前的war包 RUN rm -rf /usr/local/tomcat/webapps/*.war #把新的war包放webapps下面 ADD target/springboot.war /usr/local/tomcat/webapps #切換到指定目錄,如果不需要修改端口號可不加這兩行 #WORKDIR /usr/local/tomcat/conf/ #設置tomcat的啟動端口 #RUN sed -i 's|"8080"|"9020"|' server.xml
說明:
1)/usr/local/tomcat是官方給出的tomcat容器的目錄,若使用不同的tomcat鏡像,請參考官網。
2)springboot.war是我定義的名稱,可自定義,接着把項目推送到github上。在這個配置文件中,后兩行代碼是來修改tomcat的啟動端口的,也就是把tomcat默認的8080端口改為9020,可根據需要進行使用。如果這里改變了端口,那么在后面的任務配置中也要做相應的修改。
3)springboot的項目有內置的tomcat,要想在外部的tomcat中部署,需要做相應的打包准備,詳見https://www.cnblogs.com/zys2019/p/11945450.html#_label13。
8.2任務配置
1)選擇新建任務,創建一個maven任務
2)配置源碼
3)設置忽略test文件
-U clean install -DskipTests=true
如果pom.xml不是在項目的路徑下,而是在下一層目錄,則可寫為下一層目錄/pom.xml
4)配置版本規則
VERSION_NUMBER
${JOB_name}_${BUILD_DATE_FORMATTED,"yyyyMMdd"}
5)在Post Steps下點擊add post-build Stepst添加構建docker鏡像
springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
如果Dockerfile文件不是在當前目錄下,而在docker目錄下,那么上面的位置就是./docker
6)再添加一個SSH,用於打包后啟動tomcat容器,如圖
配置命令:
docker rm -f springboot docker run -d -p 8080:8080 --name springboot springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
這樣設置后,進行構建,版本信息顯示格式是springboot_20200727.4。如果在Dockerfile文件中修改了tomcat的端口,那么這里也要做相應的修改,把容器的端口改為對應的端口
docker run -d -p 8080:9020 --name springboot springboot:${VERSION_NUMBER}.${BUILD_NUMBER}
8.3構建測試
在上面的任務中,選擇左側的立即構建
在下面看到在構建的任務,點擊進行,選擇控制台輸出,可以看到構建過程中的部分日志信息。構建成功后就可以直接訪問項目了,虛擬機ip:8080/項目請求的路徑(這里是http://192.168.159.129:8080/springboot/test)。后期使用起來就很方便了,把更新后的項目提交到github,然后進行jenkins上,點擊構建即可。
8.4加入mysql服務
在前面的springboot項目中,並沒有使用數據庫,但是在實際開發中會用數據庫,就簡單介紹一下。在源碼中,並沒有看到mysql的使用,因為我只寫了一個簡單的模板,可以根據需要自行添加,下面的創建表和訪問數據接口也需要自行添加。
1)在docker中新建一個目錄,編寫docker-compose.yml文件,配置mysql服務並啟動
version: '3.1' services: #服務的名字 mysql: #只要docker,此容器也啟動 restart: always #指定鏡像路徑 image: daocloud.io/library/mysql:5.7.6 #設置容器名稱 container_name: mysql #設置端口號映射 ports: - 3306:3306 environment: #設置服務登錄的密碼 MYSQL_ROOT_PASSWORD: 123456 #設置時區 TZ: Asia/Shanghai
2)導入mysql和mybatis等相關的坐標
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--數據庫連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
版本控制如下:
<properties>
<druid.version>1.1.9</druid.version>
<fastjson.version>1.2.47</fastjson.version>
<mybatis.version>1.3.2</mybatis.version>
</properties>
3)編寫配置文件和接口
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:mysql://172.17.0.1:3306/db2020?serverTimezone=CTT
spring.datasource.username=root spring.datasource.password=123456
把配置文件的一部分單獨拿出來,原因是ip必須是docker服務對應的ip,只有這個ip才能在本地訪問容器中的mysql服務。
4)創建數據庫。連接到docker中的mysql,數據庫和表請自行創建。
5)測試。把項目提交到github上后進行構建,自定義的查詢數據庫的接口是正常的。
8.5加入redis服務
加入redis服務同mysql,在此略。
version: '3.1' services: redis: restart: always image: redis container_name: redis ports: - 6379:6379 command: redis-server --requirepass 123456 environment: TZ: Asia/Shanghai volumes: - ./data:/data
9.jenkins+docker實現Vue項目自動化部署
9.1項目准備
1)新建一個vue的項目,寫一個簡單的測試頁面。然后在項目的根目錄下新建一個Dockerfile的文件,內容如下
FROM nginx COPY dist /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/nginx.conf
2)在根目錄下創建一個nginx.conf,內容如下
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; server { listen 9999; server_name localhost; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
紅色的內容可自行修改。項目源碼:https://github.com/zhongyushi-git/vue-print.git
9.2任務配置
1)下載nodeJs的壓縮包,然后解壓到/opt/jenkins_docker/data下
2)在jenkins中安裝nodeJs插件,然后重啟jenkins
3)配置全局工具nodeJs
4)新建一個自由風格的軟件項目
5)源碼配置
6)配置版本規則
VERSION_NUMBER
${JOB_name}_${BUILD_DATE_FORMATTED,"yyyyMMdd"}
7)配置ndoeJS
在構建環境中設置nodeJS的路徑
8)構建打包
配置:
echo $PATH node -v npm -v npm config set registry https://registry.npm.taobao.org/
npm install npm run build
9)構建鏡像
test:${VERSION_NUMBER}.${BUILD_NUMBER}
10)啟動鏡像
docker rm -f test docker run -d -p 8080:9999 --name test test:${VERSION_NUMBER}.${BUILD_NUMBER}
11)構建測試
在上面的任務中,選擇左側的立即構建,構建成功后就可以測試,頁面能正常訪問。
10.常見問題
10.1 Bind for 0.0.0.0:80 failed: port is already allocated
這個問題的意思就是容器占用的port還沒有完全釋放。
查看進程,發現相關的容器並沒有在運行,而 docker-proxy 卻依然綁定着端口:
docker ps
查看被docker-proxy占用的端口
ps -aux | grep -v grep | grep docker-proxy
停止 doker 進程,刪除所有容器,然后刪除 local-kv.db 這個文件
service docker stop docker rm $(docker ps -aq) rm /var/lib/docker/network/files/local-kv.db service docker start
10.2 Jenkins時區設置為北京時間
打開 【系統管理】->【腳本命令行】運行下面的命令
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
10.3如何進行jenkins容器內部
docker exec -it jenkins bash
如果需要進入其他容器內部,只要把jenkins換成對應的容器名稱或容器id即可。
10.4怎么把外部文件復制到容器內部?
docker cp /opt/jenkins.sh fd:/usr/local/bin
上面就是把/opt下面的jenkins.sh復制到jenkins容器的/usr/local/bin目錄下,復制的時候,要指定容器的id。同理也可以把容器內部的文件復制到外部。容器內部一般貿易vi命令,因此會把容器內部的文件復制出來修改后再復制到內部。
10.5若直接安裝jenkins,則打包的文件在哪里?
在用戶根目錄下.jenkins/workspace/projectname/target/