Docker是一種容器技術。
容器技術又稱爲容器虛擬化
首先是一種虛擬化技術
虛擬化技術包括硬件虛擬化 半虛擬化 操作系統虛擬化
容器虛擬化就是操作系統虛擬化,是屬於輕量級的虛擬化
容器虛擬化技術是已經集成到 Linux 內核中的
容器的特性
容器首先是一個相對獨立的運行環境,並且在一個容器環境中,應該最小化對外界的影響,比如不能在容器中把宿主機上的資源全部消耗完,這就是資源控制。
容器虛擬化的核心技術
一般來說容器技術主要包含 Namespace 和 Cgroup 這兩個內核特性Namespace 又稱爲命名空間(或名字空間), 主要做訪問隔離。其原理是針對一類資源進行抽象,並將其封裝在一起提供給一個容器使用,對於這類資源,每個容器都有自己的抽象,而它們之間是不可見的,所以可以做到訪問隔離。
Cgroup 是 control group 的簡稱,又稱爲控制組,主要做資源控制。其原理是將一組進程放在一個
控制組裏,通過給這個控制組分配指定的可用資源,達到控制這一組進程可用資源的目的。
一、基於CentOS07版本
請使用centOS07版本及以上,即Linux內核版本要高於3.1。
二、安裝Docker
-
安裝必要的依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-utils提供yum-config-manager實用程序
devicemapper 存儲驅動程序需要 device-mapper-persistent-data和lvm2。 -
設置 Docker 標準發行版本的安裝源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum makecache fast
方式2:aliyun鏡像(速度快)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
-
使用開發版本的源安裝源【可以跳過】
這些開發的存儲庫包含在上面的docker.repo文件中,但默認情況下處於禁用狀態。 您可以將它們與穩
定的存儲庫一起啓用。
yum-config-manager --enable docker-ce-edge
當然也可以再次禁用它
yum-config-manager --disable docker-ce-edge
-
安裝 Docker 社區版本
安裝最新版本的Docker CE,或者轉到下一步安裝特定版本
yum install -y docker-ce
如果提示接受GPG密鑰,請驗證指紋是否與060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
匹配,
如果接受,請確認。
提示: 如果您啓用了多個 Docker 存儲庫,比如有標準的安裝源和開發測試源。則在yum install或yum update命令中 安裝或更新而不指定版本時,始終會安裝儘可能高的版本,這可能不適合您的穩定性需求。 -
重啓docker
systemctl docker restart
安裝指定版本【可以跳過】
7. 用下面的命令列出 Docker 的版本
yum list docker-ce --showduplicates | sort -r
返回的列表取決於啓用了哪些存儲庫,並且特定於您的CentOS版本(在本例中以.el7後綴表
示)。
8. 安裝指定版本
通過完全限定的軟件包名稱(它是軟件包名稱(docker-ce)加上版本字符串(第二列))安裝特
定版本,例如 docker-ce-18.03.0.ce
yum install docker-ce-<VERSION STRING>
啓動服務【啓動測試驗證】
systemctl start docker && systemctl enable docker
驗證安裝和服務是否正常
docker run hello-world
這時,Docker 會主動去下載這個鏡像,並用這個鏡像啓動一個容器;當容器運行時,它打印 hello world 並退出。
docker exec -it 服務id bash
進入服務目錄
三、安裝Docker-Compose並配置Tomcat和Mysql
在 Linux 上的也安裝⼗分簡單,從 官⽅ GitHub Release 處直接下載編譯好的⼆進制⽂件即
可。
例如,在 Linux 64 位系統上直接下載對應的⼆進制包。
//下載,可以從https://github.com/docker/compose/releases網站查看下載
curl -L https://github.com/docker/compose/releases/download/1.25.0-rc4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
//授權
chmod +x /usr/local/bin/docker-compose
chmod 777 docker-compose
//在local下創建一個docker-compose文件夾
[root@bogon local]# mkdir docker-compose
//在該文件夾下創建docker-compose.yml,進行編輯
vi docker-compose.yml
/**
*輸入以下文件【Tomcat】,注意縮進
*/
//image是鏡像,可以通過tomcat官網下載
version: '3.1'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/dockercompose/tomcat/tomcat1:/webapps
environment:
TZ: Asia/Shanghai
//也可以使用10.9.10.232:5000/tomcat:8.5.15私服下載,但是必須在【etc/docker/】下新建文件daemon.json,輸入如下內容,配置私服鏡像,端口號5000
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"10.9.10.232:5000"
]
}
//重啓docer
systemctl restart docker
//執行以下命令,進行編排
docker-compose up -d
/**
* 進行mysql的配置
*/
//在該文件夾下創建docker-compose.yml,進行編輯
vi docker-compose.yml
//輸入以下文件【Mysql】,注意縮進,也可以使用10.9.10.232:5000/tomcat:8.5.15私服下載,配置同tomcat
//一個docker-compose.yml文件僅需要一個version和services,所以,而已省略
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7.24
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
如果要啓動多個tomcat和mysql,只需要更改container_name和端口號即可
docker-compose up -d --build
重新構建
docker-compose down
關閉
docker-compose up -d
啓動
docker ps
查看進程
docker images
查看鏡像
docker rm 代碼
刪除ps後查看到的進程
docker stop 代碼
停止進程
docker rmi 代碼
停止images後查看到的鏡像
此外還有mysql8版本的yml配置信息
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
- 最後,我們可以連接youg或者navicat進行數據庫連接測試,地址是:192.168.80.111:3306,虛擬機地址即可
- 對應的在網址輸入【192.168.80.111:8080】即可訪問tomcat
四、CICD 持續集成,持續交付
互聯⽹軟件的開發和發佈,已經形成了⼀套標準流程,最重要的組成部分就是持續集成(Continuous integration,簡稱CI)。
持續集成指的是,頻繁地(⼀天多次)將代碼集成到主⼲。它的好處主要有兩個:
- 快速發現錯誤。每完成⼀點更新,就集成到主⼲,可以快速發現錯誤,定位錯誤也⽐較容易。
- 防⽌分⽀⼤幅偏離主⼲。如果不是經常集成,主⼲⼜在不斷更新,會導致以後集成的難度變⼤,甚⾄難以集成。
持續集成強調開發⼈員提交了新代碼之後,⽴刻進⾏構建、(單元)測試。根據測試結
果,我們可以確定新代碼和原有代碼能否正確地集成在⼀起。
持續交付(Continuous delivery)指的是,頻繁地將軟件的新版本,交付給質量團隊或者 ⽤戶,以供評審。如果評審通過,代碼就進⼊⽣產階段。
持續交付在持續集成的基礎上,將集成後的代碼部署到更貼近真實運⾏環境的「類⽣產環
境」(production-like environments)中。⽐如,我們完成單元測試後,可以把代碼部署
到連接數據庫的 Staging 環境中更多的測試。如果代碼沒有問題,可以繼續⼿動部署到⽣
產環境中。
4.1 環境準備
- 創建⼯作⽬錄
/usr/local/docker/runner
- 創建構建⽬錄
/usr/local/docker/runner/environment
- 下載
jdk-8u152-linux-x64.tar.gz
並複製到/usr/local/docker/runner/environment
- 下載
apache-maven-3.5.3-bin.tar.gz
並複製到/usr/local/docker/runner/environment
- 在宿主機啓動dokcer程序後先執⾏
sudo chown root:root /var/run/docker.sock
4.2 daemon.json
在 /usr/local/docker/runner/environment
⽬錄下創建 daemon.json
,⽤於配置加速器和倉庫地址
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.10.132:5000" //修改爲⾃⼰的私服地址
]
}
4.3 Dockerfile
注意更改jdk和maven的版本號,必須和下載的jdk和maven的war包一樣
在 /usr/local/docker/runner/environment
⽬錄下創建 Dockerfile
FROM 10.9.10.232:5000/gitlab/gitlab-runner:latest
# 修改軟件源
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
apt-get update -y && \
apt-get clean
# 安裝 Docker
RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \
apt-get update -y && \
apt-get install -y docker-ce
COPY daemon.json /etc/docker/daemon.json
# 安裝 Docker Compose,因爲下載不下來,所以我們本地上傳⼀份docker-compose到 environment⽬錄
WORKDIR /usr/local/bin
#RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
COPY docker-compose docker-compose
RUN chmod +x docker-compose
# 安裝 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u152-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \
rm -fr jdk-8u152-linux-x64.tar.gz
# 安裝 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gz
COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
rm -fr apache-maven-3.5.3-bin.tar.gz
# COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml
# 配置環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_152
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
WORKDIR /
如果不成功,使用如下配置
FROM 10.9.10.232:5000/gitlab/gitlab-runner:latest
# 修改軟件源
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
#下⾯的地址需要根據實際情況變化
wget https://http.kali.org/kali/pool/main/k/kali-archive-keyring/kali-archive-keyring_2018.2_all.deb --no-check-certificate && \
apt install -y ./kali-archive-keyring_2018.2_all.deb && \
apt-get update -y && \
apt install -y gnupg && \
apt-get clean
# 安裝 Docker
RUN curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
apt-get install -y python-software-properties software-properties-common && \
echo 'deb [arch=amd64] https://download.docker.com/linux/ubuntu
bionic stable' >> /etc/apt/sources.list.d/docker.list && \
apt-get update -y && \
apt-get install -y docker-ce
COPY daemon.json /etc/docker/daemon.json
# 安裝 Docker Compose,因爲下載不下來,所以我們本地上傳⼀份docker-compose到 environment⽬錄
WORKDIR /usr/local/bin
#RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
COPY docker-compose docker-compose
RUN chmod +x docker-compose
# 安裝 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u152-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \
rm -fr jdk-8u152-linux-x64.tar.gz
# 安裝 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gz
COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
rm -fr apache-maven-3.5.3-bin.tar.gz
COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml
# 配置環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_152
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
WORKDIR /
4.4 docker-compose.yml
在docker下創建gitLib文件夾,放入docker-compose.yml文件
//image改爲私服下的gitLab-ce-zh文件,需要修改hostname和external_url
//ports表示可以訪問的端口號
version: '3'
services:
web:
image: '10.9.10.232:5000/gitlab-ce-zh:11.1.4'
restart: always
hostname: '192.168.75.145'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.75.145:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
注意:
1、執行,注意ps查看進程,如果安裝的gitlab佔用了tomcat端口號的話,將tomcat關掉
2、在【/usr/local/docker/runner/environment
】下將15M的docker-compose文件複製
3、在【/usr/local/docker/runner/environment
】下放入maven的settings文件,可以配置私服
docker-compose up -d
4.5 docker-compose.yml
在 /usr/local/docker/runner
⽬錄下創建 docker-compose.yml
version: '3.1'
services:
gitlab-runner:
build: environment
restart: always
container_name: gitlab-runner
privileged: true
volumes:
- ./config:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
執行
docker-compose up -d
//出現以下指令,表示安裝成功
Successfully built 82d542ff646a
Successfully tagged runner_gitlab-runner:latest
Creating gitlab-runner ... done
4.6 使用gitLab創建項目實現CICD
- 註冊GitLab,然後創建項目。
- 將項目打成jar包
- 創建好項目,並項目下創建兩個文件
(1) .gitlab-ci.yml
stages:
- test
test:
stage: test
script:
- echo laowangkaishiyaobaile
- /usr/local/maven/apache-maven-3.6.2/bin/mvn package
- cp target/testci.jar docker/testci.jar
- docker-compose down
- docker-compose up -d --build
- docker rmi $(docker images -q -f dangling=true)
stages:
- install_deps
- test
- build
- deploy_test
- deploy_production
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
- dist/
# 安裝依賴
install_deps:
stage: install_deps
only:
- develop
- master
script:
- npm install
# 運⾏測試⽤例
test:
stage: test
only:
- develop
- master
script:
- npm run test
# 編譯
build:
stage: build
only:
- develop
- master
script:
- npm run clean
- npm run build:client
- npm run build:server
- mvn package
- docker build -t xxxx ../docker
# 部署測試服務器
deploy_test:
stage: deploy_test
only:
- develop
script:
- pm2 delete app || true
- pm2 start app.js --name app
# 部署⽣產服務器
deploy_production:
stage: deploy_production
only:
- master
script:
- bash scripts/deploy/deploy.sh
上⾯的配置把⼀次 Pipeline 分成五個階段:
- 安裝依賴(install_deps)
- 運⾏測試(test)
- 編譯(build)
- 部署測試服務器(deploy_test)
- 部署⽣產服務器(deploy_production)
注意: 設置 Job.only 後,只有當 develop 分⽀和 master 分⽀有提交的時候纔會觸發相關
的 Jobs。
節點說明:
- stages:定義構建階段,這⾥只有⼀個階段 deploy
- deploy:構建階段 deploy 的詳細配置也就是任務配置
- script:需要執⾏的 shell 腳本
- only:這⾥的 master 指在提交到 master 時執⾏
- tags:與註冊 runner 時的 tag 匹配
(2) docker-compose.yml
version: '3.1'
services:
testci:
restart: always
build: docker
container_name: testci
ports:
- 8080:8080
(3) docker包,創建Dockerfile文件
將項目的jar包複製到虛擬機位置,然後執行
FROM 10.9.10.232:5000/java:8
COPY testci.jar /usr/local/testci.jar
WORKDIR /usr/local
CMD java -jar testci.jar
FROM java:8
ENV APP_VERSION 1.0.0-SNAPSHOT
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION
/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-
$DOCKERIZE_VERSION.tar.gz \ && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
RUN mkdir /app
COPY testci-$APP_VERSION.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.10.131:3306", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
EXPOSE 8501
FROM java:8
ENV APP_VERSION 1.0.0-SNAPSHOT
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION /dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
RUN mkdir /app
COPY testci-$APP_VERSION.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait",
"tcp://192.168.10.131:3306", "java", "-
Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]
EXPOSE 8501
- 打開自己項目,進行跑步者runner設置
- 重啓docker服務
systemctl restart docker
- 授權
docker exec -it gitlab-runner usermod -aG root gitlab-runner
- 註冊
docker exec -it gitlab-runner gitlab-runner register
# 輸⼊ GitLab 地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://192.168.10.132/
# 輸⼊ GitLab Token
Please enter the gitlab-ci token for this runner:
1Lxq_f1NRfCfeNbE5WRh
# 輸⼊ Runner 的說明
Please enter the gitlab-ci description for this runner:
可以爲空
# 設置 Tag,可以⽤於指定在構建規定的 tag 時觸發 ci
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
# 這⾥選擇 true ,可以⽤於代碼上傳後直接執⾏
Whether to run untagged builds [true/false]:
true
# 這⾥選擇 false,可以直接回⻋,默認爲 false
Whether to lock Runner to current project [true/false]:
false
# 選擇 runner 執⾏器,這⾥我們選擇的是 shell
Please enter the executor: virtualbox, docker+machine, parallels, shell,
ssh, docker-ssh+machine, kubernetes, docker, docker-ssh:
shell
- 註冊後,刷新gitlab頁面,在下面會找到提交的結果,再次點擊Runner並勾選
- 使⽤ Runner
所有操作完成後 push 代碼到服務器,查看是否成功,passed 表示執⾏成功
其他操作
刪除註冊信息
gitlab-ci-multi-runner unregister --name "名稱"
查看註冊列表
gitlab-ci-multi-runner list
五、ElasticSearch配置
[root@localhost ~]# cd /usr/local
[root@localhost local]# cd docker-compose/
[root@localhost docker-compose]# mkdir elasticsearch
[root@localhost docker-compose]# cd elasticsearch/
[root@localhost elasticsearch]# vi docker-compose.yml
version: '3.1'
services:
elasticsearch:
image: 10.9.10.232:5000/elasticsearch:6.5.4
restart: always
container_name: elasticsearch
ports:
- 9000:9200
- 9001:9300
environment:
discovery.type: single-node
kibana:
image: 10.9.10.232:5000/kibana:6.5.4
environment:
SERVER_NAME: kibana
#注意修改爲本機地址
ELASTICSEARCH_URL: http://10.9.21.117:9000
ports:
- "9002:5601"
~
"docker-compose.yml" [New] 19L, 417C written
//執行安裝
[root@localhost elasticsearch]# docker-compose up -d
//關閉防火牆
[root@localhost runner]# systemctl stop firewalld
//查看服務,看是否安裝成功
[root@localhost runner]# docker ps
//以下操作爲關閉相關服務操作
[root@localhost gitLib]# cd ../runner/
[root@localhost runner]# ll
總用量 4
drwxr-xr-x. 2 root root 25 11月 8 16:57 config
-rw-r--r--. 1 root root 239 11月 7 19:26 docker-compose.yml
drwxr-xr-x. 2 root root 156 11月 7 19:58 environment
[root@localhost runner]# docker-compose down