前言
- 初入docker門的新人膀捷,容器化概念越來越流行懊亡,希望這篇小白文能幫助到想使用docker做部署的大家效诅。其中有什么遺漏梧乘,錯誤歡迎大家指出!
- 這篇文章適用于簡單的部署單機應用,想部署集群化的進階操作還需要加入k8s稼虎,對這部實踐完成后再發(fā)一份集群化的部署文章衅檀。
服務器基本信息
- 操作系統(tǒng):Centos 7.4
部署概要圖
環(huán)境搭建
docker
-
安裝docker
-
安裝所需依賴
$ sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
-
更新穩(wěn)定倉庫
$ sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
安裝最新版本的docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
-
啟動docker
$ sudo systemctl start docker
-
設(shè)置開機啟動
$ sudo systemctl enable docker
-
docker-compose
-
安裝docker-compse
-
下載安裝包
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
-
賦予可執(zhí)行文件權(quán)限
$ sudo chmod +x /usr/local/bin/docker-compose
-
docker鏡像準備
-
所需鏡像
- gogs
- jenkins
- letsencrypt-nginx-proxy-companion
- nginx-proxy
- open-jdk1.8
- mysql:5.7
- redis
-
鏡像拉取
$ docker pull gogs/gogs
$ docker pull jenkins
$ docker pull jrcs/letsencrypt-nginx-proxy-companion
$ docker pull jwilder/nginx-proxy
$ docker pull openjdk:8-jdk-alpine
$ docker pull mysql:5.7
$ docker pull redis
-
通過docker-compse啟動鏡像
-
分別創(chuàng)建3個文件夾comm,project,nginx-proxy里面都放docker-compose.yml文件
mkdir /web/docker/comm && mkdir /web/docker/project && mkdir /web/docker/nginx-proxy
-
配置comm下的docker-compose.yml文件
version: "3" services: redis: #service應用名稱 image: docker.io/redis #鏡像地址 container_name: redis #容器名稱 restart: always #自動重啟 command: redis-server --requirepass redis_pwd #設(shè)置redis連接密碼 ports: #映射6379端口到宿主機的6379端口 - 6379:6379 volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化 - /web/data/redis:/data - /etc/localtime:/etc/localtime db: image: docker.io/mysql:5.7 container_name: mysql restart: always ports: #映射3306端口到宿主機的3306端口 - 3306:3306 environment: #設(shè)置mysql連接密碼 MYSQL_ROOT_PASSWORD: mysql_pwd volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化 - /etc/localtime:/etc/localtime - /web/data/mysql:/var/lib/mysql git-gogs: image: gogs/gogs container_name: git-gogs restart: always environment: #(VIRTUAL_HOST與LETSENCRYPT_HOST填寫的內(nèi)容一致) - VIRTUAL_PORT=3000 #轉(zhuǎn)發(fā)端口 - VIRTUAL_HOST=git.xx.xx #域名轉(zhuǎn)發(fā)(填上自己的域名) - LETSENCRYPT_HOST=git.xx.xx #ssl證書申請域名(填上自己的域名) - LETSENCRYPT_EMAIL=xx@xx.xx #ssl證書到期通知郵箱(填上自己的郵箱) volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化 - /etc/localtime:/etc/localtime - /web/data/gogs:/data/git/gogs-repositories expose: #對宿內(nèi)部docker網(wǎng)絡(luò)開放3000端口 - 3000 # ports: #映射3000端口到宿主機的3000端口 # - 3000:3000 links: #進行容器連接,連接上面配置好的db服務別名為mysql - db:mysql jenkins: image: jenkins container_name: jenkins restart: always # ports: #映射8080端口到宿主機的8080端口 # - 8080:8080 environment: - VIRTUAL_PORT=8080 - VIRTUAL_HOST=jenkins.xx.xx - LETSENCRYPT_HOST=jenkins.xx.xx - LETSENCRYPT_EMAIL=jenkins.xx.xx volumes: #掛載數(shù)據(jù)到宿主機中做數(shù)據(jù)持久化 - /etc/localtime:/etc/localtime - /web/data/jenkins:/var/jenkins_home networks: # 設(shè)置內(nèi)部網(wǎng)絡(luò)nginx-proxy default: external: name: nginx-proxy
-
配置nginx-proxy下的docker-compose.yml文件
version: "3" services: nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - 80:80 - 443:443 restart: always volumes: - html:/usr/share/nginx/html #docker內(nèi)部數(shù)據(jù)卷掛載html - dhparam:/etc/nginx/dhparam #docker內(nèi)部數(shù)據(jù)卷掛載dhparam - vhost:/etc/nginx/vhost.d #docker內(nèi)部數(shù)據(jù)卷掛載vhost - certs:/etc/nginx/certs:ro #docker內(nèi)部數(shù)據(jù)卷掛載certs - /var/run/docker.sock:/tmp/docker.sock:ro #掛載宿主機docker.sock用于監(jiān)聽容器啟動情況 labels: # 設(shè)置一個標簽 - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy" letsencrypt-nginx-proxy-companion: restart: always image: jrcs/letsencrypt-nginx-proxy-companion container_name: letsencrypt-nginx-proxy-companion volumes: - /web/config/nginx:/etc/nginx/nginx.conf - certs:/etc/nginx/certs:rw - vhost:/etc/nginx/vhost.d - html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro volumes: #設(shè)置數(shù)據(jù)卷 certs: html: vhost: dhparam: networks: #設(shè)置內(nèi)部網(wǎng)絡(luò)nginx-proxy default: external: name: nginx-proxy
project中的docker-compse.yml文件稍后結(jié)合項目再配置
-
-
啟動redis,mysql,jenkins,gogs,letsencrypt-nginx-proxy-companion,nginx-proxy容器
-
掛載目錄授權(quán)
$ sudo chown -R 1000 /home/yk/data
-
啟動容器
-
啟動comm下配置的容器
$ cd /web/docker/comm && docker-compose up -d
-
啟動nginx-proxy下的容器
$ cd /web/docker/nginx-proxy && docker-compose up -d
-
-
-
項目Dockerfile配置
-
后端項目配置
-
在項目根目錄新建一個文件docker/dev/Dockerfile內(nèi)容如下
FROM openjdk:8-jdk-alpine COPY app.jar /app/app.jar ENV JAVA_OPTS="" EXPOSE 8080 ENV TIME_ZONE=Asia/Shanghai ENTRYPOINT exec java $JAVA_OPTS -jar /app/app.jar --spring.profiles.active=dev #springboot的環(huán)境配置
-
-
前端項目配置
-
在項目根目錄新建一個文件docker/dev/Dockerfile內(nèi)容如下
FROM nginx COPY ./dist /usr/share/nginx/html
-
-
配置服務器中的/web/docker/proj中的docker-compose.yml文件
version: "3" services: web-dev: image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址 container_name: web-dev environment: - VIRTUAL_PORT=8080 - VIRTUAL_HOST=web-dev.xx.xx - LETSENCRYPT_HOST=web-dev.xx.xx - LETSENCRYPT_EMAIL=xx@xx.xx volumes: - /etc/localtime:/etc/localtime expose: - 8080 web-cms-dev: restart: always image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址 container_name: web-cms-dev environment: - VIRTUAL_PORT=8080 - VIRTUAL_HOST=web-cms-dev.xx.xx - LETSENCRYPT_HOST=web-cms-dev.xx.xx - LETSENCRYPT_EMAIL=xx@xx.xx volumes: - /etc/localtime:/etc/localtime javaee-api-dev: image: registry.cn-shenzhen.aliyuncs.com/xx/xx #這里填寫你的docker云倉庫項目地址 container_name: javaee-api-dev environment: - MYSQL_USER=mysql_user - MYSQL_PWD=mysql_pwd - REDIS_PWD=redis_pwd - VIRTUAL_PORT=8080 - VIRTUAL_HOST=javaee-api-dev.xx.xx - LETSENCRYPT_HOST=javaee-api-dev.xx.xx - LETSENCRYPT_EMAIL=xx@xx.xx volumes: - /etc/localtime:/etc/localtime external_links: - redis:redis - db:mysql networks: default: external: name: nginx-proxy
gogs配置
-
gogs簡介
- Gogs 的目標是打造一個最簡單、最快速和最輕松的方式搭建自助 Git 服務霎俩。使用 Go 語言開發(fā)使得 Gogs 能夠通過獨立的二進制分發(fā)哀军,并且支持 Go 語言支持的 所有平臺沉眶,包括 Linux、Mac OS X杉适、Windows 以及 ARM 平臺谎倔。
-
訪問gogs:
url地址為docker-compose.yml中配置好的LETSENCRYPT_HOST域名地址git.xx.xx
-
如果想要通過ip地址訪問則需要映射出3000端口到宿主機中,
ports: #映射3000端口到宿主機的3000端口 - 3000:3000
-
首次啟動gogs
- 數(shù)據(jù)庫主機:通過link進行容器連接可以填mysql:3306,如數(shù)據(jù)庫不通過link方式啟動填對應ip地址即可
- 應用url和域名:填寫docker-compose 中配置的ssl證書申請地址
-
配置webhook
- 推送地址
- 填上jenkin訪問地址
- 注意project_token需要配合jenkin地址填寫
- 密鑰文本
- 配合jenkin填寫
ae131d098561550b0b56e0251e8091d.png - 推送地址
docker云倉庫配置
申請docker云倉庫
- 創(chuàng)建docker命名空間
jenkins配置
-
jenkins介紹
-
jenkins是一款開源 CI&CD 軟件猿推,用于自動化各種任務片习,包括構(gòu)建、測試和部署軟件蹬叭。
jenkins 支持各種運行方式藕咏,可通過系統(tǒng)包、Docker 或者通過一個獨立的 Java 程序
-
-
訪問jenkins:
url地址為docker-compose.yml中配置好的LETSENCRYPT_HOST域名地址jenkins.xx.xx
-
如果想要通過ip地址訪問則需要映射出8080端口到宿主機中,
ports: #映射8080端口到宿主機的8080端口 - 8080:8080
-
首次啟動jenkins
-
先進入容器
$ docker exec -it jenkins /bin/bash
-
查看文本內(nèi)容
$ cat /var/jenkins_home/secrets/initialAdminPassword
將文本內(nèi)容張貼到Administrator password 中點擊Continue
-
退出容器
$ exit
-
-
安裝插件
-
在 Customize Jenkins 頁面內(nèi)秽五, 您可以安裝任何數(shù)量的有用插件作為您初始步驟的一部分孽查。
兩個選項可以設(shè)置:
- 安裝建議的插件 - 安裝推薦的一組插件,這些插件基于最常見的用例.
- 選擇要安裝的插件 - 選擇安裝的插件集坦喘。當你第一次訪問插件選擇頁面時盲再,默認選擇建議的插件。
-
進入插件安裝頁面瓣铣,搜索點擊安裝即可
- Manage Jenkins->pluginManager
-
需要用到的jenkins插件有
-
Docker plugin
- 用于進行docker構(gòu)建 -
Git
-git管理 -
Gogs plugin
-配合gogs使用 -
Maven Integration
-maven構(gòu)建管理工具,構(gòu)建后端項目 -
NodeJS
-node環(huán)境工具,構(gòu)建前端項目 -
Publish Over SSH
-進行ssh連接 -
Generic Webhook Trigger Plugin
-設(shè)置webhook觸發(fā)條件
-
-
-
配置ssh
-
進入配置頁面
Manage Jenkins->configure system
-
配置ssh
bb4edc68989b13b6c3e4dd8c73a1b97.png
-
-
配置云docker
-
使用安全的TLS方式部署
$ openssl genrsa -aes256 -out ca-key.pem 4096 # 生成CA私鑰 #生成CA公鑰答朋,也就是證書(注意:Common Name (e.g. server FQDN or YOUR name) []:$HOST) $ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem $ openssl genrsa -out server-key.pem 4096 # 生成服務器私鑰 $ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr # 用私鑰生成證書請求文件 $ echo subjectAltName = IP:$HOST,IP:127.0.0.1 > extfile.cnf # 將Docker守護程序密鑰的擴展使用屬性設(shè)置為僅用于服務器身份驗證: $ echo extendedKeyUsage = serverAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
-
-
配置客戶端證書
$ openssl genrsa -out key.pem 4096 # 客戶端私鑰 $ openssl req -subj '/CN=client' -new -key key.pem -out client.csr # 客戶端證書請求文件 # 要使密鑰適配客戶端身份驗證,請創(chuàng)建擴展配置文件: $ echo extendedKeyUsage = clientAuth >> extfile.cnf $ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf # 刪除證書請求文件: $ rm -v client.csr server.csr # 默認的私鑰權(quán)限太開放了棠笑,為了更加的安全绿映,我們需要更改證書的權(quán)限,刪除寫入權(quán)限腐晾,限制閱讀權(quán)限(只有你能查看): $ chmod -v 0400 ca-key.pem key.pem server-key.pem # 證書文件刪除其寫入權(quán)限: $ chmod -v 0444 ca.pem server-cert.pem cert.pem
-
證書部署
# centos $ sudo vi /etc/sysconfig/docker 如:OPTIONS='--selinux-enabled --log-driver=journald --tlsverify=true' DOCKER_CERT_PATH=/etc/docker $ sudo service docker restart # daemon.json $ sudo vi /etc/docker/daemon.json { "tlsverify": true, "tlscert": "/var/docker/server-cert.pem", "tlskey": "/var/docker/server-key.pem", "tlscacert": "/var/docker/ca.pem", "hosts": [ "tcp://0.0.0.0:2376", "unix:///var/run/docker.sock" ] } # 啟動守護進程 $ dockerd
在系統(tǒng)管理->系統(tǒng)設(shè)置->cloud-> Docker Host UR填寫
tcp://主機ip:2376
配置 Server credentials
選擇類型Docker Host Certificate Authentication,將生成的證書如下圖填寫
-
配置node.js環(huán)境
-
進入配置頁面
- Manage Jenkins->Global Tool Configuration
選擇需要的node.js版本
1ecc0bbd6ac14decf33b39f1ba3bf51.png -
-
配置git憑證
8a35edf717261555adc68780f899b70.png
-
配置docker倉庫登錄憑證
- 訪問憑證可以從這里查看
6e9042ddae0e9f725416f30c0c6b59a.png
- 憑證配置
-
配置項目構(gòu)建過程
-
后端java項目配置
- New Item->構(gòu)建一個maven項目
d6a28f8531cffb1a61c580d11d203df.png -
-
前端vue項目配置
前端vue項目和后端大同小異叉弦,有2點需要改動
New Item->Freestyle project
-
選擇配置好的node.js環(huán)境
1155cdb992a6af71b01173145a2f461.png
執(zhí)行的構(gòu)建命令和后端的maven不一樣使用npm進行構(gòu)建
- 其他配置按需修改即可
訪問項目
web-dev.xx.xx
web-cms-dev.xx.xx
javaee-api-dev.xx.xx