Docker基本使用與項目部署


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.鏡像的操作

Docker鏡像是由文件系統疊加而成,可以認為鏡像就是對某些運行環境或者軟件打的包,用戶可以從docker倉庫中下載基礎鏡像到本地,保證開發人員的環境和測試人員的環境完全一致。

鏡像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)查看日志

docker-compose logs -f

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介紹

https://www.jenkins.io/

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM