一篇文章學(xué)會docker
docker安裝
docker在線安裝
1.更新yum到最新
yum update
2.卸載舊版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
3.安裝需要的軟件包殃姓,yum-util提供yum-config-manager功能
yum install -y yum-utils device-mapper-persistent-data lvm2
3.設(shè)置yum倉庫
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
4.安裝docker铐然,默認y確認
yum install -y docker-ce
5.啟動并查看docker版本
systemctl start docker
docker -v
離線安裝
1.下載好docker的離線二進制包
wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz
2.解壓docker涝滴,并將所有docker下所有內(nèi)容已到/usr/bin目錄下
tar -zxvf docker-18.06.3-ce.tgz
sudo cp docker/* /usr/bin
3.開啟docker服務(wù)
sudo dockerd &
4.現(xiàn)在你可以嘗試著打印下版本號,試著看看 images鲤拿,看看 info
sudo docker --version
5.docker命令不需要敲sudo的方法
sudo groupadd docker
sudo usermod -aG docker 用戶名
6.綁定docker倉庫ip和端口
sudo vim /etc/docker/daemon.json
{ "insecure-registries":["ip:port"] }
7.注冊docker為service服務(wù)
注冊后可以通過systemclt來管理socker服務(wù)
systemctl start/stop/restart/ docker
將以下內(nèi)容寫入/etc/systemd/system/docker.service
中(沒有該文件則新建)假褪。
vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
8.修改文件為可執(zhí)行文件
chmod +x /etc/systemd/system/docker.service #添加文件權(quán)限
9.啟動docker
systemctl daemon-reload #重載unit配置文件
systemctl start docker #啟動Docker
systemctl enable docker.service #設(shè)置開機自啟
docker架構(gòu)
docker三個基本概念
- 鏡像
images
:docker鏡像(image),相當(dāng)于一個root文件系統(tǒng)近顷,如官方鏡像ubuntu:16.04生音,包含了ubuntu:16.04完整的最小的root文件系統(tǒng)。 - 容器
container
:鏡像(image)和容器(container)的關(guān)系幕庐,好比面向?qū)ο笾蓄惡蛯ο蟮年P(guān)系久锥。鏡像是靜態(tài)的定義,容器是鏡像實例化的實體异剥。 - 倉庫
repository
:倉庫(repository)可以看作一個代碼管理中心,用來保存鏡像絮重。
配置docker鏡像加速器
Docker Registry
公開服務(wù)是開放給用戶使用冤寿、允許用戶管理鏡像的 Registry 服 務(wù)。
最常使用的 Registry 公開服務(wù)是官方的 Docker Hub
青伤,這也是默認的 Registry督怜,并 擁有大量的高質(zhì)量的官方鏡像。
從Docker Hub
下載docker鏡像狠角,比較慢号杠,一般會配置鏡像加速器:
1.daocloud加速器
終端執(zhí)行:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
這個命令是修改/etc/docker/daemon.json文件,寫入一個json數(shù)據(jù)如下
[root@s20 ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}# 配置好了docker加速器,下載鏡像就快很多了
注意:有的人使用這個命令后會出問題,這個問題可以通過修改這個json文本丰歌,去掉最后的逗號姨蟋,即可。
2.阿里云加速器
通過修改daemon配置文件/etc/docker/daemon.json來使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jaqjblse.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
鏡像加速地址立帖,通過登錄阿里云服務(wù)搜索得到眼溶。
docker操作命令
docker服務(wù)相關(guān)命令
1.啟動docker服務(wù)
systemctl start docker
2.停止docker服務(wù)
systemctl stop docker
3.重啟docker服務(wù)
systemctl restart docker
4.查看docker服務(wù)狀態(tài)
systemctl status docker
5.開機自啟動docker
systemctl enable docker
docker鏡像相關(guān)命令
docker鏡像命令如下幾類:
1.查看鏡像
docker images
docker images -q # 查看所有的鏡像id
2.搜索鏡像
docker search 鏡像名稱
3.拉取鏡像
docker pull 鏡像名[:版本]
docker pull centos:7
可以指定版本,版本號取hub倉庫查找:hub.docker.com
4.刪除鏡像
docker rmi 容器id/容器名 # 刪除指定本地鏡像
docker rmi `docker images -q` # 刪除所有本地鏡像
docker容器相關(guān)命令
1.查看容器
docker ps # 查看正在運行的容器
docker ps -a # 查看所有容器晓勇,包括停止的
2.創(chuàng)建并啟動容器
docker run 參數(shù)
參數(shù)說明
- -i:
interactive
-交互式堂飞,保持容器運行,與-t同時使用绑咱,-it創(chuàng)建容器并進入绰筛,退出后,容器自動關(guān)閉 - -t:
terminate
-終端描融,為容器分配一個偽終端铝噩,通常與-i同時使用 - -d:
daemon
-守護,以守護(后臺)模型運行容器稼稿,使用docker exec
進入容器 - -it:創(chuàng)建交互式容器薄榛,-id:創(chuàng)建守護式容器
- --name:為創(chuàng)建的容器命名
3.進入容器
docker exec 參數(shù) 容器名 # 退出容器讳窟,容器不會關(guān)閉
4.停止容器
docker stop 容器名
5.刪除容器,運行狀態(tài)需要先停止在刪除
docker rm 容器名
6.查看容器信息
docker inspect 容器名
容器的數(shù)據(jù)卷
數(shù)據(jù)卷概念
1.數(shù)據(jù)卷:宿主機中的一個目錄或文件
宿主機和容器中映射的文件夾敞恋,或者文件
2.數(shù)據(jù)卷的特點
- 數(shù)據(jù)卷目錄和容器目錄綁定是丽啡,目錄的修改對宿主機和容器是同步的
- 一個數(shù)據(jù)卷可以被多個容器同時掛載
- 一個容器也可以掛載多個數(shù)據(jù)卷
3.數(shù)據(jù)卷作用
- 容器數(shù)據(jù)持久化
- 外部機器和容器間通信
- 容器之間數(shù)據(jù)交換
配置數(shù)據(jù)卷
1.創(chuàng)建容器時,使用-v
參數(shù)設(shè)置數(shù)據(jù)卷
docker run ... -v 宿主機目錄(文件):容器內(nèi)目錄(文件)
注意:
- 目錄必須是絕對路徑
- 如果目錄不存在硬猫,會自動創(chuàng)建
- 可以掛載多個數(shù)據(jù)卷
數(shù)據(jù)卷容器
多個容器進行數(shù)據(jù)交換
- 多個容器掛載數(shù)據(jù)卷同一個數(shù)據(jù)卷
- 數(shù)據(jù)卷容器
配置數(shù)據(jù)卷容器
1.創(chuàng)建啟動c3數(shù)據(jù)卷容器补箍,使用-v
設(shè)置數(shù)據(jù)卷
docker run -it --name=c3 -v /volume centos /bin/bash
2.創(chuàng)建啟動c1,c2容器,使用 --volumes-from
參數(shù) 設(shè)置數(shù)據(jù)卷
docker run -it --name=c1 --volumns-from c3 centos /bin/bash
docker run -it --name=c2 --volumns-from c3 centos /bin/bash
作用:
- 創(chuàng)建一個容器啸蜜,掛載一個目錄坑雅,讓其他容器繼承該容器(--
volumn-from
) - 通過簡單的方式實現(xiàn)數(shù)據(jù)卷配置
docker端口映射
1.概念
容器內(nèi)的網(wǎng)絡(luò)服務(wù)和外部機器不能直接通信,但是外部機器可以和宿主機直接通信衬横,這樣就需要通過宿主機搭建橋梁裹粤。
讓容器中的網(wǎng)絡(luò)服務(wù)需要被外部機器訪問是,可以將容器中提供服務(wù)的端口映射到宿主機的端口上蜂林,外部機器訪問宿主機的該端口是遥诉,間接訪問容器的服務(wù),這個就被稱作:端口映射
端口映射通過-p
參數(shù)指定
2.實現(xiàn)端口映射
docker -run ... -p 宿主機port:容器中port 容器名
docker應(yīng)用部署實例
docker部署mysql
實現(xiàn)docker容器中部署mysql噪叙,并通過外部mysql客戶端操作mysql server
1.搜索myslq鏡像
docker search mysql
2.拉取mysql鏡像
docker pull mysql:5.6
3.創(chuàng)建容器矮锈,設(shè)置端口映射,目錄映射
root目錄下創(chuàng)建/data/mysql
mkdir -p /opt/mysql
cd /opt/mysql
運行容器
docker run -id \
-p 3307:3306 \
--name c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
參數(shù)說明
-
-p 3307:3306
睁蕾,容器3306映射到宿主機3307 -
-v $PWD/conf:/etc/mysql/conf.d
苞笨,當(dāng)前路徑下/conf掛載到容器/etc/mysql/conf.d -
-v $PWD/logs:/logs
,當(dāng)前路徑下/conf掛載到容器/logs -
-v $PWD/data:/var/lib/mysql
子眶,當(dāng)前路徑下/conf掛載到容器/var/lib/mysql -
-e MYSQL_ROOT_PASSWORD=123456
瀑凝,初始root密碼 -e 配置環(huán)境變量
docker部署tomcat
1.搜索tomcat鏡像
docker search tomcat
2.拉取tomcat鏡像
docker pull tomcat
3.創(chuàng)建容器,設(shè)置端口映射壹店,目錄映射
root目錄下創(chuàng)建/opt/tomcat
mkdir -p /opt/tomcat
cd /opt/tomcat
運行容器
docker run -id \
-p 8080:8080 \
--name c_tomcat \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
參數(shù)說明
-
-p 8080:8080
猜丹,容器8080映射到宿主機8080 -
-v $PWD/:/usr/local/tomcat/webapps
,當(dāng)前路徑下/conf掛載到容器webapps
docker部署nginx
實現(xiàn)docker容器中部署mysql硅卢,并通過外部mysql客戶端操作mysql server
1.搜索nginx鏡像
docker search nginx
2.拉取nginx鏡像
docker pull nginx
3.創(chuàng)建容器射窒,設(shè)置端口映射,目錄映射
root目錄下創(chuàng)建/data/mysql
mkdir -p /opt/nginx
cd /opt/nginx
mkdir conf
拷貝nginx官方配置文件将塑,寫入/opt/nginx/conf/nginx.conf
#user nobody;
#nginx進程脉顿,一般數(shù)值為cpu核數(shù)
worker_processes 1;
#錯誤日志存放目錄
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進程pid存放位置
#pid logs/nginx.pid;
#工作模式及連接數(shù)上限
events {
#單個后臺worker process進程的最大并發(fā)鏈接數(shù)
worker_connections 1024;
}
http {
#文件擴展名與類型映射表
include mime.types;
#默認文件類型
default_type application/octet-stream;
#設(shè)置日志模式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#nginx訪問日志
#access_log logs/access.log main;
#開啟高效傳輸模式
sendfile on;
#激活tcp_nopush參數(shù)可以允許把httpresponse header和文件的開始放在一個文件里發(fā)布, 積極的作用是減少網(wǎng)絡(luò)報文段的數(shù)量
#tcp_nopush on;
#連接超時時間点寥,單位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
#開啟gzip壓縮功能
#gzip on;
#基于域名的虛擬主機
server {
#監(jiān)聽端口
listen 80;
server_name localhost;
#編碼識別
#charset koi8-r;
#日志格式及日志存放路徑
#access_log logs/host.access.log main;
location / {
#站點根目錄艾疟,即網(wǎng)站程序存放目錄
root html;
#首頁排序
index index.html index.htm;
}
#錯誤頁面
#error_page 404 /404.html;
# 將服務(wù)器錯誤頁面重定向到靜態(tài)頁面/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#代理PHP腳本到Apache上監(jiān)聽127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#將PHP腳本傳遞到正在監(jiān)聽127.0.0.1:9000的FastCGI服務(wù)器
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
#如果Apache的文檔根目錄與nginx的根目錄一致,則拒絕訪問.htaccess文件
#location ~ /\.ht {
# deny all;
#}
}
#另一個虛擬主機,混合使用IP蔽莱、名稱和基于端口的配置
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# 服務(wù)的證書
# ssl_certificate cert.pem;
# 服務(wù)端key
# ssl_certificate_key cert.key;
# 會話緩存
# ssl_session_cache shared:SSL:1m;
# 會話超時時間
# ssl_session_timeout 5m;
# #加密算法
# ssl_ciphers HIGH:!aNULL:!MD5;
# 啟動加密算法
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
運行容器
docker run -id \
-p 80:80 \
--name c_nginx \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
參數(shù)說明
-
-p 80:80
弟疆,容器80映射到宿主機80 -
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf
,掛載配置文件到容器
docker部署redis
1.搜索redis鏡像
docker search redis
2.拉取redis鏡像
docker pull redis
3.創(chuàng)建容器盗冷,設(shè)置端口映射怠苔,目錄映射
運行容器
docker run -id \
-p 6379:6379 \
--name c_redis \
redis:5.0
4.外部鏈接redis服務(wù)
./redis-cli.exe -h ip -p port
docker鏡像原理
1.操作系統(tǒng)重要的組成部分:文件管理子系統(tǒng)。而linux文件系統(tǒng)有bootfs和rootfs兩部分組成:
bootfs
:包含bootloader(引導(dǎo)加載程序)和kernel(內(nèi)核)rootfs
:root文件系統(tǒng)仪糖,包含的就是典型Linux系統(tǒng)中的/dev柑司,/proc,/etc
2.docker鏡像是由特殊的文件系統(tǒng)疊加而成
- 最底層是bootfs锅劝,并使用宿主機的bootfs
- 第二層是root文件系統(tǒng)rootfs攒驰,成為base image
- 在往上疊加其他鏡像文件
3.docker鏡像的特點
統(tǒng)一的文件系統(tǒng),隱藏了很多層的存在故爵,用戶看來玻粪,只存在一個文件系統(tǒng)。
一個鏡像放在另一個鏡像上稠集,下面的稱為父鏡像奶段,最底層稱為基礎(chǔ)鏡像。
當(dāng)一個鏡像容器啟動剥纷,docker在會在頂層加載一個讀寫文件系統(tǒng)作為容器
4.小結(jié)
docker鏡像本質(zhì):一個分層的文件系統(tǒng),能夠不斷復(fù)用呢铆,
centos鏡像比操作系統(tǒng)iso小很多晦鞋,是因為對rootfs的復(fù)用。
tomcat鏡像比安裝包大很多棺克,是因為有很多依賴父鏡像和基礎(chǔ)鏡像悠垛。
Docker鏡像制作
1.容器轉(zhuǎn)鏡像
在已存在的鏡像中做修改,最終提交為新的鏡像
docker commit 容器id 鏡像名稱:版本號
還可以將鏡像壓縮為文件娜谊,進行傳輸确买。
docker save -o 壓縮文件名 鏡像名稱:版本號
將文件解壓為鏡像
docker load -i 壓縮文件名
注意:通過這種方式生成的容器,目錄掛載的地方不會改變纱皆,其他位置都會改變湾趾。
2.dockerfile制作鏡像*
dockerfile
是一個文件,包含了一條條指令派草,每一條指令構(gòu)建一層搀缠,基于基礎(chǔ)鏡像,最終構(gòu)建一個新鏡像近迁。
<img src="https://tva1.sinaimg.cn/large/00831rSTgy1gd4bnw8ienj30hg0l8gpt.jpg" alt="image-20200324002244500" style="zoom:67%;" />
3.dockerfile命令
關(guān)鍵字 | 作用 | 備注 |
---|---|---|
FROM | 指定父鏡像 | 指定dockerfile基礎(chǔ)鏡像 |
MAINTAINER | 作者信息 | 標識dockerfile作者 |
LABEL | 標簽 | docker標簽艺普,可代替maintainer |
RUN | 執(zhí)行命令 | 指定一段命令,默認/bin/sh ;RUN commond或RUN["commond", "param1", "param2"] |
CMD | 容器啟動命令 | 容器啟動時候的默認命令歧譬,格式CMD command p1 p2 |
ENTRYPOINT | 入口 | 一般在制作一些執(zhí)行就關(guān)閉的容器中使用 |
COPY | 復(fù)制文件 | build的時候復(fù)制文件到images中 |
ADD | 添加文件 | build的時候添加到images岸浑,另含解壓作用,來源可以是遠程服務(wù) |
ENV | 環(huán)境變量 | 指定build時候的環(huán)境變量瑰步,在容器時可以通過 -e 格式name=value覆蓋 |
ARG | 構(gòu)建參數(shù) | 在構(gòu)建的時候使用的參數(shù)矢洲,ENV中相同名字的值始終覆蓋arg的參數(shù) |
VOLUME | 定義外部掛載數(shù)據(jù)卷 | 指定build的image那些目錄可以掛載到文件系統(tǒng)中,啟動時使用-v格式綁定。 |
EXPOSE | 暴露端口 | 定義容器運行監(jiān)聽的端口卡儒,啟動容器時使用-p來綁定胞皱,EXPOST 8080 |
WORKDIR | 工作目錄 | 指定容器內(nèi)部工作目錄,沒有的則自動創(chuàng)建掘譬,“/”開頭是絕對路徑,不是“/”開頭呻拌,則是workdir路徑的相對路徑 |
USER | 指定指定用戶 | 指定build或者啟動容器時葱轩,在 RUN COM ENTRYPOINT執(zhí)行的時候的用戶 |
HEALTHCHECK | 檢查健康 | 指定檢測當(dāng)前容器的健康檢測的命令,基本沒用 |
ONBUILD | 觸發(fā)器 | 存在ONBUILD關(guān)鍵字的鏡像作基礎(chǔ)鏡像的時候藐握,當(dāng)指定FROM完成之后靴拱,會指定ONBUILD的命令,用處不大 |
STOPSINGNAL | 發(fā)送信號到宿主機 | STOPSINGNAL指令設(shè)置將發(fā)送到容器的系統(tǒng)調(diào)用信號以退出 |
SHELL | 指定執(zhí)行腳本的shell | 指定RUN COM ENTRYPOINT執(zhí)行命令的時候猾普,使用的shell |
4.dockerfile制作鏡像例子
vim centos_dockerfiles
# 1.定義父鏡像
FROM centos:7
# 2.指定作者信息
MAINTAINER ryxiong <ryxiong.com>
# 3.執(zhí)行安裝vim命令
RUN yum install -y vim
# 4.定義默認工作目錄
WORKDIR /usr
# 5.定義容器啟動執(zhí)行的命令
CMD /bin/bash
制作命令
docker build -f ./centos_dockerfiles -t centos:1.0 .
- -f 指定dockerfile文件
- -t 執(zhí)行鏡像名字
案例-django項目docker部署
1.準備django運行的環(huán)境基礎(chǔ)鏡像
[ryxiong@ryxiong ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
django 1.0 ba0aa44992b1 9 hours ago 372MB
2.準備django項目工程文件
django-test
3.編寫dockerfile文件
FROM django:1.0
MAINTAINER ryxiong
ADD ./django-test # 當(dāng)前路徑的django工程
CD ./django-test # 進入工程文件根目錄
CMD python3 manage.py runserver
4.打包項目鏡像
docker build -f ./dockerfile -t web:1.0 .
5.根據(jù)項目鏡像啟動容器
docker run -id -p 9000:8000 web:1.0
6.查看項目容器狀態(tài)
docker ps
Docker服務(wù)編排
docker-compose
1.背景
微服務(wù)架構(gòu)中應(yīng)用系統(tǒng)包含若干個微服務(wù)袜炕,每個微服務(wù)部署多個實例,每個微服務(wù)手動啟停初家,維護工作巨大偎窘。
- Dockerfile build image 或 docker pull image
- 創(chuàng)建多個container
- 管理多個container(啟動停止)
2.服務(wù)編排
按照一定的業(yè)務(wù)規(guī)則批量管理容器
3.docker-compose
工具
Docker-compose是一個編排多容器分布式部署的工具,提供命令集中管理容器化應(yīng)用的完整開發(fā)周期溜在,包括服務(wù)構(gòu)建陌知,啟動和停止,使用方法:
- 利用dockerfile定義運行環(huán)境鏡像
- 使用docker-compose.yml定義組成應(yīng)用的各服務(wù)
- 運行docker-compose up 啟動應(yīng)用
4.docker-compose安裝
docker-compose
是基于docker掖肋,安裝之前仆葡,需要先安裝docker,docker-compose
以編譯好的二進制包方式安裝在linux中志笼。
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
其他版本替換1.24.1沿盅。
設(shè)置文件可執(zhí)行權(quán)限
$ sudo chmod +x /usr/local/bin/docker-compose
創(chuàng)建軟鏈:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
測試是否安裝成功:
$ docker-compose --version
cker-compose version 1.24.1, build 4667896b
docker-compose的卸載
rm /usr/local/bin/docker-compose
docker-compose部署項目案例
1.創(chuàng)建測試項目
$ mkdir composetest
$ cd composetest
編寫composetest/app.py 文件代碼
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
在此示例中,redis 是應(yīng)用程序網(wǎng)絡(luò)上的 redis 容器的主機名籽腕,該主機使用的端口為 6379嗡呼。
在 composetest 目錄中創(chuàng)建另一個名為 requirements.txt 的文件,內(nèi)容如下:
flask
redis
2.創(chuàng)建dockerfile文件
在 composetest 目錄中皇耗,創(chuàng)建一個名為的文件 Dockerfile南窗,內(nèi)容如下:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
Dockerfile 內(nèi)容解釋:
FROM python:3.7-alpine: 從 Python 3.7 映像開始構(gòu)建鏡像。
WORKDIR /code: 將工作目錄設(shè)置為 /code。
-
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
設(shè)置 flask 命令使用的環(huán)境變量万伤。
RUN apk add --no-cache gcc musl-dev linux-headers: 安裝 gcc窒悔,以便諸如 MarkupSafe 和 SQLAlchemy 之類的 Python 包可以編譯加速。
-
COPY requirements.txt requirements.txt RUN pip install -r requirements.txt
復(fù)制 requirements.txt 并安裝 Python 依賴項敌买。
COPY . .: 將 . 項目中的當(dāng)前目錄復(fù)制到 . 鏡像中的工作目錄简珠。
CMD ["flask", "run"]: 容器提供默認的執(zhí)行命令為:flask run。
3.創(chuàng)建 docker-compose.yml
在測試目錄中創(chuàng)建一個名為 docker-compose.yml 的文件虹钮,然后粘貼以下內(nèi)容:
docker-compose.yml 配置文件
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
該 Compose 文件定義了兩個服務(wù):web 和 redis聋庵。
- web:該 web 服務(wù)使用從 Dockerfile 當(dāng)前目錄中構(gòu)建的鏡像。然后芙粱,它將容器和主機綁定到暴露的端口 5000祭玉。此示例服務(wù)使用 Flask Web 服務(wù)器的默認端口 5000 。
- redis:該 redis 服務(wù)使用 Docker Hub 的公共 Redis 映像春畔。
4.使用 Compose 命令構(gòu)建和運行您的應(yīng)用
在測試目錄中脱货,執(zhí)行以下命令來啟動應(yīng)用程序:
docker-compose up
如果你想在后臺執(zhí)行該服務(wù)可以加上 -d 參數(shù):
docker-compose up -d
5.yml配置指令參考
build
指定為構(gòu)建鏡像上下文路徑
version: "3.7"
services:
webapp:
build: ./dir
depends_on
設(shè)置依賴關(guān)系。
- docker-compose up :以依賴性順序啟動服務(wù)律姨。在以下示例中振峻,先啟動 db 和 redis ,才會啟動 web择份。
- docker-compose up SERVICE :自動包含 SERVICE 的依賴項扣孟。在以下示例中,docker-compose up web 還將創(chuàng)建并啟動 db 和 redis荣赶。
- docker-compose stop :按依賴關(guān)系順序停止服務(wù)哈打。在以下示例中,web 在 db 和 redis 之前停止讯壶。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
deploy
指定與服務(wù)的部署和運行有關(guān)的配置。只在 swarm 模式下才會有用湾盗。
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
可以選參數(shù):
endpoint_mode
:訪問集群服務(wù)的方式伏蚊。
endpoint_mode: vip
# Docker 集群服務(wù)一個對外的虛擬 ip。所有的請求都會通過這個虛擬 ip 到達集群服務(wù)內(nèi)部的機器格粪。
endpoint_mode: dnsrr
# DNS 輪詢(DNSRR)躏吊。所有的請求會自動輪詢獲取到集群 ip 列表中的一個 ip 地址。
labels
:在服務(wù)上設(shè)置標簽帐萎”确可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。
mode
:指定服務(wù)提供的模式疆导。
replicated
:復(fù)制服務(wù)赁项,復(fù)制指定服務(wù)到集群的機器上。global
:全局服務(wù),服務(wù)將部署至集群的每個節(jié)點悠菜。-
圖解:下圖中黃色的方塊是 replicated 模式的運行情況舰攒,灰色方塊是 global 模式的運行情況。
environment
添加環(huán)境變量悔醋。您可以使用數(shù)組或字典摩窃、任何布爾值,布爾值需要用引號引起來芬骄,以確保 YML 解析器不會將其轉(zhuǎn)換為 True 或 False猾愿。
environment:
RACK_ENV: development
SHOW: 'true'
expose
暴露端口,但不映射到宿主機账阻,只被連接的服務(wù)訪問蒂秘。
僅可以指定內(nèi)部端口為參數(shù):
expose:
- "3000"
- "8000"
image
指定容器運行的鏡像。以下格式都可以:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 鏡像id
volumes
將主機的數(shù)據(jù)卷或著文件掛載到容器里宰僧。
version: "3.7"
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
docker私有倉庫
搭建私有倉庫
1.拉取私有倉庫鏡像
docker pull registry
2.啟動私有倉庫
docker run -id --name registry -p 5000:5000 registry
3.驗證私有倉庫
打開瀏覽器材彪,輸入http://私有倉庫服務(wù)器ip:5000/v2/_catalog,看到{"repositories":[]}表示搭建成功
4.修改daemon.json
vim /etc/docker/daemon.json
添加key琴儿,信任私有倉庫地址段化,寫入自己私有倉庫真實ip
{"insecure-registries":["私有倉庫服務(wù)器ip:5000"]}
私有倉庫上傳和拉取
1.標記鏡像為私有倉庫鏡像
docker tag centos:7 私有倉庫ip:5000/centos:7
2.上傳標記的鏡像
docker push 私有倉庫ip:5000/centos:7
3.拉取到本地
docker pull 私有倉庫ip:5000/centos:7
Docker-machine
簡介
Docker Machine 是一種讓您在虛擬主機上安裝 Docker 的工具,并可以使用 docker-machine 命令來管理主機造成。
Docker Machine 功能
- 集中管理所有的 docker 主機
- 啟動显熏,檢查,停止和重新啟動托管主機
- 升級 Docker 客戶端和守護程序
- 配置 Docker 客戶端與主機進行通信
安裝
安裝 Docker Machine 之前你需要先安裝 Docker
Linux 安裝命令
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
chmod +x /usr/local/bin/docker-machine
macOS 安裝命令
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
chmod +x /usr/local/bin/docker-machine
Windows 安裝命令
如果你是 Windows 平臺晒屎,可以使用 Git BASH喘蟆,并輸入以下命令:
base=https://github.com/docker/machine/releases/download/v0.16.0 &&
mkdir -p "$HOME/bin" &&
curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" &&
chmod +x "$HOME/bin/docker-machine.exe"
查看是否安裝成功:
docker-machine version
docker-machine version 0.16.0, build 9371605
使用
1.列出可用機器,默認有default虛擬機
docker-machine ls
2.創(chuàng)建機器
創(chuàng)建一個名為test的機器
$ docker-machine create --driver virtualbox test
- --driver:指定用來創(chuàng)建機器的驅(qū)動類型鼓鲁,這里是 virtualbox
3.查看機器ip
docker-machine ip test
4.停止機器
docker-machine stop test
5.啟動機器
docker-machine start test
6.進入機器
docker-machine ssh test
docker-machine 命令參數(shù)說明
-
docker-machine active:查看當(dāng)前激活狀態(tài)的 Docker 主機蕴轨。
docker-machine ls NAME ACTIVE DRIVER STATE URL dev - virtualbox Running tcp://192.168.99.103:2376 staging * digitalocean Running tcp://203.0.113.81:2376 echo $DOCKER_HOST tcp://203.0.113.81:2376 docker-machine active staging
config:查看當(dāng)前激活狀態(tài) Docker 主機的連接信息。
creat:創(chuàng)建 Docker 主機
env:顯示連接到某個主機需要的環(huán)境變量
inspect: 以 json 格式輸出指定Docker的詳細信息
ip: 獲取指定 Docker 主機的地址
kill: 直接殺死指定的 Docker 主機
ls: 列出所有的管理主機
provision: 重新配置指定主機
regenerate-certs: 為某個主機重新生成 TLS 信息
restart: 重啟指定的主機
rm: 刪除某臺 Docker 主機骇吭,對應(yīng)的虛擬機也會被刪除
ssh: 通過 SSH 連接到主機上橙弱,執(zhí)行命令
scp: 在 Docker 主機之間以及 Docker 主機和本地主機之間通過 scp 遠程復(fù)制數(shù)據(jù)
mount: 使用 SSHFS 從計算機裝載或卸載目錄
start: 啟動一個指定的 Docker 主機,如果對象是個虛擬機燥狰,該虛擬機將被啟動
status: 獲取指定 Docker 主機的狀態(tài)(包括:Running棘脐、Paused、Saved龙致、Stopped蛀缝、Stopping、Starting目代、Error)等
stop: 停止一個指定的 Docker 主機
upgrade: 將一個指定主機的 Docker 版本更新為最新
url: 獲取指定 Docker 主機的監(jiān)聽 URL
version: 顯示 Docker Machine 的版本或者主機 Docker 版本
help: 顯示幫助信息
Swarm 集群管理
簡介
Docker Swarm 是 Docker 的集群管理工具屈梁。它將 Docker 主機池轉(zhuǎn)變?yōu)閱蝹€虛擬 Docker 主機嗤练。 Docker Swarm 提供了標準的 Docker API,所有任何已經(jīng)與 Docker 守護程序通信的工具都可以使用 Swarm 輕松地擴展到多個主機俘闯。
支持的工具包括但不限于以下各項:
- Dokku
- Docker Compose
- Docker Machine
- Jenkins
原理
如下圖所示潭苞,swarm
集群由管理節(jié)點(manager
)和工作節(jié)點(work node
)構(gòu)成。
-
swarm mananger
:負責(zé)整個集群的管理工作包括集群配置真朗、服務(wù)管理等所有跟集群有關(guān)的工作此疹。 -
work node
:即圖中的 available node,主要負責(zé)運行相應(yīng)的服務(wù)來執(zhí)行任務(wù)(task)遮婶。
<img src="https://tva1.sinaimg.cn/large/00831rSTgy1gd9i1s8m9mj31200qsgve.jpg" alt="image-20200328115130329" style="zoom:67%;" />
使用
1.創(chuàng)建 swarm 集群管理節(jié)點(manager)
docker-machine create -d virtualbox swarm-manager
初始化 swarm 集群蝗碎,進行初始化的這臺機器,就是集群的管理節(jié)點旗扑。
docker-machine ssh swarm-manager
docker swarm init --advertise-addr 192.168.99.107 #這里的 IP 為創(chuàng)建機器時分配的 ip蹦骑。
成功會輸出一段命令,在增加工作節(jié)點時會用到:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
2.創(chuàng)建swarm 集群工作節(jié)點(worker)
這里直接創(chuàng)建好倆臺機器臀防,swarm-worker1 和 swarm-worker2
docker-machine create -d virtualbox swarm-worker1
docker-machine create -d virtualbox swarm-worker2
分別進入倆個機器里眠菇,指定添加至上一步中創(chuàng)建的集群,這里會用到上一步復(fù)制的內(nèi)容袱衷。
docker-machine ssh swarm-worker1
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
3.查看集群信息
docker info
4.部署服務(wù)到集群中
注意:跟集群管理有關(guān)的任何操作捎废,都是在管理節(jié)點上操作的。
以下例子致燥,在一個工作節(jié)點上創(chuàng)建一個名為 helloworld 的服務(wù)登疗,這里是隨機指派給一個工作節(jié)點
docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com
5.查看服務(wù)部署情況
docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com
查看 helloworld 部署的具體信息:
docker@swarm-manager:~$ docker service inspect --pretty helloworld
6.擴展集群服務(wù)
docker@swarm-manager:~$ docker service scale helloworld=2
服務(wù)已經(jīng)從一個節(jié)點,擴展到兩個節(jié)點
7.刪除服務(wù)
docker@swarm-manager:~$ docker service rm helloworld
確認是否刪除
docker service ps helloworld
8.滾動升級服務(wù)
將 redis 版本滾動升級至更高版本
創(chuàng)建一個 3.0.6 版本的 redis嫌蚤。
docker@swarm-manager:~$ docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
滾動升級 redis 辐益。
docker@swarm-manager:~$ docker service update --image redis:3.0.7 redis
9.停止某個節(jié)點接收新的任務(wù)
查看所有的節(jié)點:
docker@swarm-manager:~$ docker node ls
可以看到目前所有的節(jié)點都是 Active, 可以接收新的任務(wù)分配。
停止節(jié)點 swarm-worker1
docker@swarm-manager:~$ docker node update --availability drain swarm-worker1
注意:swarm-worker1 狀態(tài)變?yōu)?Drain脱吱。不會影響到集群的服務(wù)智政,只是 swarm-worker1 節(jié)點不再接收新的任務(wù),集群的負載能力有所下降箱蝠。
重新激活節(jié)點
docker@swarm-manager:~$ docker node update --availability active swarm-worker1
docker-stack集群管理
docker stack deploy
命令用于部署新的堆椗觯或更新現(xiàn)有堆棧。從群集中的compose
文件或dab
文件創(chuàng)建和更新堆棧抡锈,必須以管理員節(jié)點為目標運行此命令。
用法
docker stack deploy [OPTIONS] STACK
參數(shù)
名稱乔外,簡寫 | 默認 | 說明 |
---|---|---|
--bundle-file |
分布式應(yīng)用程序包文件的路徑 | |
--compose-file, -c |
Compose 文件的路徑 | |
--with-registry-auth |
false |
將注冊表身份驗證詳細信息發(fā)送給Swarm代理 |
相關(guān)命令
命令 | 描述 |
---|---|
docker stack deploy |
部署新的堆棿踩或更新現(xiàn)有堆棧 |
docker stack ls |
列出現(xiàn)有堆棧 |
docker stack ps |
列出堆棧中的任務(wù) |
docker stack rm |
刪除堆棧 |
docker stack services |
列出堆棧中的服務(wù) |
示例
deploy
命令支持3.0
及更高版本的Compose文件。
$ docker stack deploy --compose-file docker-compose.yml vossibility
Ignoring unsupported options: links
Creating network vossibility_vossibility
Creating network vossibility_default
Creating service vossibility_nsqd
Creating service vossibility_logstash
Creating service vossibility_elasticsearch
Creating service vossibility_kibana
Creating service vossibility_ghollector
Creating service vossibility_lookupd
您可以驗證服務(wù)是否正確創(chuàng)建 -
$ docker service ls
ID NAME MODE REPLICAS IMAGE
29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa
7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03
9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe
axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba
DAB文件
$ docker stack deploy --bundle-file vossibility-stack.dab vossibility
Loading bundle from vossibility-stack.dab
Creating service vossibility_elasticsearch
Creating service vossibility_kibana
Creating service vossibility_logstash
Creating service vossibility_lookupd
Creating service vossibility_nsqd
Creating service vossibility_vossibility-collector
您可以驗證服務(wù)是否正確創(chuàng)建 -
$ docker service ls
ID NAME MODE REPLICAS IMAGE
29bv0vnlm903 vossibility_lookupd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4awt47624qwh vossibility_nsqd replicated 1/1 nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4tjx9biia6fs vossibility_elasticsearch replicated 1/1 elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa
7563uuzr9eys vossibility_kibana replicated 1/1 kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03
9gc5m4met4he vossibility_logstash replicated 1/1 logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe
axqh55ipl40h vossibility_vossibility-collector replicated 1/1 icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba