什么是容器礼搁?
本質(zhì)上是一個容器
是一個被隔離的環(huán)境
隔離的環(huán)境擁有自己的系統(tǒng)文件梳星,ip地址秀存,主機名等
容器就是在隔離的環(huán)境運行的一個進程,如果進程停止,容器就會銷毀。隔離的環(huán)境擁有自己的系統(tǒng)文件瑰妄,ip地址,主機名等
容器和虛擬化的區(qū)別
linux容器技術(shù)映砖,容器虛擬化和kvm虛擬化的區(qū)別
kvm虛擬化: 需要硬件的支持间坐,需要模擬硬件,可以運行不同的操作系統(tǒng)邑退,啟動時間分鐘級(開機啟動流程)
linux開機啟動流程:
bios開機硬件自檢 根據(jù)bios設(shè)置的優(yōu)先啟動項boot 網(wǎng)卡 硬盤 u盤 光驅(qū)
讀取mbr引導 2T UEFI(gpt分區(qū)) mbr硬盤分區(qū)信息竹宋,內(nèi)核加載路徑,
加載內(nèi)核 啟動第一個進程/sbin/init systemd
系統(tǒng)初始化完成 運行服務(nginx,httpd地技,mysql)
容器啟動流程: 共用宿主機內(nèi)核: 第一個進程直接啟動服務(nginx蜈七,httpd,mysql)
容器:共用宿主機內(nèi)核莫矗,輕量級飒硅,損耗少,啟動快作谚,性能高三娩,只能運行l(wèi)inux系統(tǒng)
虛擬機:需要硬件的支持,需要模擬硬件妹懒,需要走開機啟動流程尽棕,可以運行不同的操作系統(tǒng)
容器技術(shù)的發(fā)展過程:
1.chroot技術(shù),新建一個子系統(tǒng)(擁有自己完整的系統(tǒng)文件)
參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ chang root
2.linux容器(lxc) linux container(namespaces 命名空間 隔離環(huán)境 及cgroups 資源限制)
容器的類型
lxc:進程多彬伦,需要初始化化系統(tǒng)滔悉,然后在啟動服務進程
docker:直接啟動進程服務,
rkt:
Docker容器
Docker是通過進程虛擬化技術(shù)(namespaces及cgroupscpu单绑、內(nèi)存回官、磁盤io等)來提供容器的資源隔離與安全保障等。
由于Docker通過操作系統(tǒng)層的虛擬化實現(xiàn)隔離搂橙,所以Docker容器在運行時歉提,不需要類似虛擬機(VM)額外的操作系統(tǒng)開銷,提高資源利用率区转。
namespace 資源隔離
cgroups 進程的資源限制 CPU 硬盤IO
kvm 虛擬磁盤文件苔巨,資源隔離
kvm 資源限制,--cpus --memory
docker 初期把lxc二次開發(fā)废离,后期自己研發(fā)的系統(tǒng)libcontainer
docker的主要組成部分
docker是傳統(tǒng)的CS架構(gòu)分為docker client和docker server,向mysql一樣
docker主要組件有:鏡像侄泽、容器、倉庫, 網(wǎng)絡蜻韭,存儲
啟動容器必須需要一個鏡像悼尾,倉庫中只存儲鏡像
容器---鏡像---倉庫
一次構(gòu)建,處處運行
docker是一種軟件的打包技術(shù)
安裝Docker
centos7.6 2G 10.0.0.11 docker01 host解析
centos7.6 2G 10.0.0.12 docker02 host解析
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y(ce是社區(qū)辦ee是企業(yè)版)
systemctl start docker 啟動容器服務
systemctl enable docker 開機自啟
Docker的鏡像管理
鏡像命令=docker image tab鍵補全查看
容器命令=docker container tab鍵補全查看
docker search +需要的鏡像名稱 搜索鏡像
選鏡像的建議:
1肖方,優(yōu)先考慮官方
2闺魏,stars數(shù)量多
官方鏡像倉庫地址:hub.docker.com
?docker pull(push) 獲取鏡像和上傳鏡像
?鏡像加速器:阿里云加速器,daocloud加速器俯画,中科大加速器析桥,Docker 中國官方鏡像加速:https://registry.docker-cn.com
?
配置docker鏡像加速
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
官方pull docker pull centos:6.8(沒有指定版本,默認會下載最新版)
私有倉庫pull docker pull daocloud.io/huangzhichong/alpine-cn:latest
Docker的基本命令
docker search +需要的鏡像名稱 搜索鏡像
?docker pull(push)nginx:1.41(指定版本不加1.41 不指定就是下載最新版本) 獲取鏡像和上傳鏡像
docker version 查看版本信息
docker info 顯示 Docker 系統(tǒng)信息艰垂,包括鏡像和容器數(shù)
?docker images 例子 docker image ls 查看鏡像列表
?docker rmi 例子:docker image rm centos:latest 刪除鏡像(如果鏡像正在被使用 是刪除不了的)
docker image prune 批量刪除不用的鏡像
?docker save 例子:docker image save centos:v2(名稱加版本) -o docker-centos7.4.tar.gz(必須壓縮包形式) 導出鏡像
?docker load 例子:docker image load -i docker-centos7.4.tar.gz 導入鏡像
docker history +鏡像名 查看鏡像的分層
docker start 9d1be7dd2dc8(主機ID) 啟動容器
docker stop +ID或名字 停止容器
docker kill +ID或名字 殺死容器
docker ps(-a -l -q) 查看容器列表(-a 查看所有 -l查看第一個容器 -q查看所有容器的id)
docker ps --no-trunc 查看容器啟動的詳情
docker container ls (-a -l -q) 查看容器列表 泡仗,同上
docker container rm ID或者名稱 刪除容器(container可以省略)
docker container rm -f ID 強制刪除
docker rm -f `docker ps -a -q` 批量刪除 不管死活
docker container prune 批量刪除不用的容器
docker cp /opt 9d1be7dd2dc8:/opt 從宿主機上拷貝文件到容器中
docker inspect +鏡像或者容器 查看鏡像和容器的詳細信息
docker image build --network=host(使用宿主機網(wǎng)路) -t centos_nginx:v1 /dockerfile/nginx/ 構(gòu)建鏡像
Docker的管理和啟動
docker run -d(放在后臺) -p(端口映射) 80(宿主機的端口):80(容器的端口) nginx:1.4 創(chuàng)建并開啟容器
-d(放在后臺)
-p(端口映射)
-v(掛載宿主機的目錄到容器目錄中,必須目錄對目錄材泄,文件對文件)例/opt/index.html:/etc/nginx/index.html
docker run -it(分配交互式終端) (--name test)指定容器的名字 centos:v1 /bin/bash (登錄容器的初始命令) 運行時進入容器
-it(分配交互式終端)
--name 指定容器的名字(不怎么用)
/bin/bash (登錄容器的初始命令)
Ctrl+d 退出容器
Ctrl+p,Ctrl+q 退出容器()
進入正在運行的容器
docker exec -it 容器id或容器名字 /bin/bash(/bin/sh)
docker attach +ID(使用同一個終端) 偷偷離開的快捷鍵ctrl+p,ctrl+q 盡量不要使用
總結(jié):docker容器內(nèi)的第一個進程(初始命令)必須一直處于前臺運行的狀態(tài)(必須夯拙诨馈),否則這個容器拉宗,就會處于退出狀態(tài)峦树!
在宿主機上啟動容器讓他夯主,并在容器內(nèi)也要讓服務夯主旦事,不然容器就會死掉
Docker 容器的網(wǎng)絡訪問
我們把docker 啟動時 系統(tǒng)會默認把內(nèi)核轉(zhuǎn)發(fā)打開魁巩,并配置iptables的規(guī)則
[root@docker01 ~]# sysctl -a |grep ipv4 |grep forward
net.ipv4.ip_forward = 1
[root@docker01 ~]# sysctl net.ipv4.ip_forward=1
[root@docker01 ~]# iptables -t nat -L -n
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:3306
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
多個容器都想使用8080端口
需要在宿主機上增加一塊網(wǎng)卡
[root@docker01 ~]# ifconfig eth0:1 10.0.0.13/24 up
docker run -d -p 10.0.0.13:8080:80 nginx:1.4
docker run -d -p 10.0.0.11:8080:80 nginx:1.4
-p ip::containerPort(隨機端口)
?-p hostPort:containerPort/udp
?-p 10.0.0.100::53/udp 使用宿主機的10.0.0.100這個ip地址的隨機端口的udp協(xié)議映射容器的udp53端口
?-p 81:80 –p 443:443 可以指定多個-p
docker run -d -P nginx:1.4(自動隨機端口映射)
服務器一掛起容器就會上不了網(wǎng)
我們在宿主機上編輯內(nèi)核轉(zhuǎn)發(fā)配置文件
vim /etc/sysctl.conf
net.ipv4.ip_forward=1 尾部添加
sysctl -p 命令行引用一下即可
docker啟動之后報錯,上不了網(wǎng)
docker run -it -p 81:81 centos:6.9
WARNING: IPv4 forwarding is disabled. Networking will not work.
在宿主機上
echo net.ipv4.ip_forward=1>>/usrb/sysctl.d/00-system.conf
再重啟network和docker服務
systemctl restart network && systemctl restart docker
docker的數(shù)據(jù)卷管理
docker volume ls 查看卷
docker volume inspect +卷名 查看卷的詳細信息和位置
宿主上xiaonian目錄是空的,容器會把對應自己目錄下的東西拷貝到宿主機上姐浮,兩個目錄會互相同步對方差異的文件谷遂,
docker run -d -p 80:80 -v xiaoniao:/opt nginx:latest
卷可以共用
docker run -d -p 81:80 -v xiaoniao:/opt nginx:latest
數(shù)據(jù)卷容器
? --volumes-from(跟某一個已經(jīng)存在的容器掛載相同的卷)
docker run -d -p 80:80 --volumes-from +容器名 +鏡像 跟那個容器掛同樣的鏡像來運行這個容器
基于nginx啟動一個容器,監(jiān)聽80和81卖鲤,訪問80肾扰,出現(xiàn)nginx默認歡迎首頁畴嘶,訪問81,出現(xiàn)小鳥集晚。(基于nginx多端口的多站點窗悯。)
1)把小鳥飛飛的配置文件寫好放在opt下 通過-v參數(shù) 把宿主機上的配置文件放到容器中 代碼也是一樣 (文件是實時對應的 宿主機一改動 容器也會被修改)
docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/opt nginx:latest
2)先啟動容器 把宿主機opt下的代碼放到容器的opt下 把宿主機的的配置文件放到容器的對應站點目錄 (文件是實時對應的 宿主機一改動 容器也會被修改)
docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/opt nginx:latest
docker container cp xiaoniao.conf 2b5c61d6780:/etc/nginx/conf.d/xiaoniao.conf
Ctrl +d
docker restart 2b5c61d678 重啟容器即可
制作Docker鏡像
1)啟動一個基礎(chǔ)容器(centos 或者別的系統(tǒng))
docker run -it -p 80:80 centos:6.9 加上端口可以邊寫邊測試
正常安裝所需要的服務
yum install nginx php-fpm....
配置
啟動
2)把容器提交為鏡像
docker commit 5a9a6ea1713b(ID) wordpress:v1
查看docker images
3)測試鏡像功能是否可用
docker run -it -d -p 80:80 -p 3306:3306 wordpress
但是啟動了容器服務沒起來
進入容器
docker exec -it 5a9a6ea1713b /bin/bash
手動啟動服務
service php-fpm start
service mysqld start
nginx -g 'daemon off;' 讓服務夯主
我們可以在容器里寫個腳本,使用容器就變得方便偷拔,不用再進入容器手動啟動服務
vi /init.sh
#!/bin/bash
service php-fpm start
service mysqld start
nginx -g "daemon off;"
測試瀏覽器搜索 頁面正常
docker run -it -d -p 80:80 -p 3306:3306 wordpress sh /init.sh
Dockerfile自動構(gòu)建docker鏡像
1)手動搭建鏡像
2)根據(jù)手動搭建鏡像 根據(jù)歷史命令構(gòu)建dockerdile
3)使用dockerfile構(gòu)建鏡像
4)測試鏡像
全程在宿主上
[root@docker01 ~]# mkdir /dockerfile 創(chuàng)建dockerfile的目錄
[root@docker01 ~]# cd /dockerfile/
[root@docker01 dockerfile]# mkdir nginx 鏡像名稱對應目錄(每個鏡像創(chuàng)建不同的名稱蒋院,不能混合使用)
[root@docker01 dockerfile]# cd nginx
[root@docker01 nginx]# vim dockerfile 名稱必須是dockerfile不然構(gòu)建鏡像找不到dockerfile文件會失敗
FROM centos:6.9
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN yum install nginx -y
CMD ["nginx","-g","daemon off;"]
docker image build --network=host(使用宿主機網(wǎng)路) -t(指定構(gòu)建鏡像名字) centos_nginx:v1 /dockerfile/nginx/(找這個目錄下的dockerfile文件) 構(gòu)建鏡像
docker run -d -p 8080:80 centos_nginx:v1 測試鏡像
dockerfile常用指令:(每一個指令都會產(chǎn)生利益臨時的容器) 不能出現(xiàn)交互式的問題 不然就會出現(xiàn)問題
FROM 指定基礎(chǔ)鏡像 FROM centos:6.9
MAINTAINER 指定維護者信息,可以沒有
LABLE 描述莲绰,標簽
RUN 在命令前面加上RUN即可 例如 RUN yum install nginx -y
ADD 從宿主機上把文件拷貝到指定目錄并覆蓋原來文件(會自動解壓tar包) (盡量把代碼放到跟dockerfile 文件一起 然后ADD /opt/code /usr/share/nginx/html 把宿主機上代碼 目錄下的文件 放到容器的對應目錄 )
WORKDIR 設(shè)置當前工作目錄 例如 WORKDIR /usr/share/nginx/html(后面執(zhí)行的操作都在這個目錄中)
VOLUME 設(shè)置卷欺旧,掛載主機目錄 VOLUME /usr/share/nginx/html 把容器上的內(nèi)容持久化到 宿主機上 通過docker container inspect 2283cdaf9600 |grep -i volume 可以查看目錄
EXPOSE 指定對外的端口(和-P 隨機端口一起使用) 例如 EXPOSE 22 80 (會把docker鏡像映射到宿主機的隨機端口)
CMD 容易被替換 語法 CMD ["nginx","-g","daemon off;"](原命令nginx -g 'daemon off';)
dockerfile其他指令:
COPY 復制文件(不會解壓tar包) COPY /opt/xiaoniao /code/xiaoniao 把宿主機這個目錄下的內(nèi)容放到容器的對應目錄
ENV 環(huán)境變量 在dockerfile中指定$MYSQL_ROOT 我們在啟動容器時需要 --env "MYSQL_ROOT=123456" 指定環(huán)境變量
ENTRYPOINT 容器啟動后執(zhí)行的命令(無法被替換,啟容器的時候指定的命令蛤签,會被當成參數(shù))
(ADD /dockerfile/xiaoniao/init.sh /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]) 會無視用戶在啟動容器時 輸入不相關(guān)的命令
docker鏡像的分層(kvm 鏈接克隆辞友,寫時復制的特性)
鏡像分層的好處:復用,節(jié)省磁盤空間,相同的內(nèi)容只需加載一份到內(nèi)存顷啼。
修改dockerfile之后踏枣,再次構(gòu)建速度快
docker history +鏡像 查看鏡像的分層
dockerfile 優(yōu)化:
1:盡可能選擇體積小linux,alpine
2:盡可能合并RUN指令钙蒙,清理無用的文件(yum緩存茵瀑,源碼包)
RUN yum install nginx -y && \
yum install php -y && \
yum clean all
3:修改dockerfile,把變化的內(nèi)容盡可能放在dockerfile結(jié)尾
4: 使用.dockerignore躬厌,減少不必要的文件ADD
在dockerfile配置文件同目錄下 把一些不需要ADD的文件寫到.dockerignore 中 (或者把不需要的東西移到別的目錄下)
vim .dockerignore
xiaoniao.tar.gz
容器間的互聯(lián)(--link 是單方向的B碜颉!?甘)(每次link一下 就會在容器中做一下hosts解析)
先啟動一個容器
docker run -d --name nginx nginx:v1
我們在啟動一個容器
docker run -it --link nginx(要link的容器名稱):nginx(這是在新容器里的別名)) +鏡像 /bin/bash
進入容器直接可以
curl -I http://nginx
ping nginx
使用docker運行zabbix-server
docker run --name mysql-server -t \
? -e MYSQL_DATABASE(環(huán)境變量在容器中指定)="zabbix" \
? -e MYSQL_USER="zabbix" \
? -e MYSQL_PASSWORD="zabbix_pwd" \
? -e MYSQL_ROOT_PASSWORD="root_pwd" \
? -d mysql:5.7 \
? --character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
? -d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
? -e DB_SERVER_HOST="mysql-server" \
? -e MYSQL_DATABASE="zabbix" \
? -e MYSQL_USER="zabbix" \
? -e MYSQL_PASSWORD="zabbix_pwd" \
? -e MYSQL_ROOT_PASSWORD="root_pwd" \
? -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
? --link mysql-server:mysql \
? --link zabbix-java-gateway:zabbix-java-gateway \
? -p 10051:10051 \
? -d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
? -e DB_SERVER_HOST="mysql-server" \
? -e MYSQL_DATABASE="zabbix" \
? -e MYSQL_USER="zabbix" \
? -e MYSQL_PASSWORD="zabbix_pwd" \
? -e MYSQL_ROOT_PASSWORD="root_pwd" \
? --link mysql-server:mysql \
? --link zabbix-server-mysql:zabbix-server \
? -p 80:80 \
? -d zabbix/zabbix-web-nginx-mysql:latest
普通的registry (私有倉庫) (如果上傳的鏡像名稱一致會把原有的給覆蓋掉 )
先拉取regitry官方倉庫的鏡像
docker pull registry
docker load -i registry.tar.gz 導入鏡像
關(guān)于docker registry的安裝鸿捧,可以說簡單的不能再簡單了,docker run一個容器就好了疙渣,也就是一條命令的事
docker run -d -p 5000:5000 --restart=always(重啟docker 會自動拉取這個容器) --name registry -v /opt/myregistry:/var/lib/registry registry
格式:docker tag 源鏡像名字:版本 私有倉庫地址/鏡像名字:版本
例如:
docker tag centos:6.10(鏡像名) 10.0.0.11:5000/centos:6.10(打完標簽的名字)
push上傳
docker push 10.0.0.11:5000/centos:6.10
默認上傳肯定報錯匙奴!(因為它只走https協(xié)議 在docker配置文件中 讓他走http協(xié)議)
The push refers to a repository [10.0.0.11:5000/centos:6.10]
Get https://10.0.0.11:5000/v1/_ping: http: server gave HTTP response to HTTPS client
解決辦法:
把自己的私有鏡像倉庫加到信任的倉庫列表中。(最好所有容器宿主機都加 妄荔,不然push的時候會報錯)
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
systemctl restart docker
直接使用私有倉庫的鏡像
docker run -d -p 80:80 10.0.0.11:5000/nginx:v1
刪除鏡像
1)進入docker registry的容器中
docker exec -it registry /bin/sh
2) 刪除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
3) 清楚掉blob
registry garbage-collect /etc/docker/registry/config.yml
帶認證的registry
yum install httpd-tools -y 下載生成密碼的工具htpasswd
mkdir /opt/registry-var/auth/ -p 創(chuàng)建認證用戶的目錄
htpasswd -Bbn oldboy 123456 >> /opt/registry-var/auth/htpasswd 添加用戶名和密碼
啟動容器
docker run -d -p 5000:5000 -v /opt/registry-var/auth/:/auth/ -v /opt/myregistry:/var/lib/registry -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
提示:上傳下載鏡像都需要登陸哦
docker login 10.0.0.11:5000 登錄
oldboy
123456
docker logout 10.0.0.11:5000登出
詳細https://www.qstack.com.cn/archives/350.html
docker-compose(單機版的容器編排工具)
yum install -y docker-compose(需要epel源)
先pull 下載鏡像
導入鏡像
mkdir /docker-compose/wordpress 創(chuàng)建項目目錄
vi /docker-compose/wordpress/docker-compose.yml 存放文件只能是yml 或者yaml 結(jié)尾的文件
version: '3'
services:
db: (啟動第一個容器)
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress: 第二個容器
depends_on:
- db
image: wordpress:latest
volumes:
- web_data:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes: 卷
db_data:
web_data:
啟動的命令 并放到后臺
docker-compose up -d
關(guān)閉
docker-compose down
如果mysql容器死掉
docker-compose start db 根據(jù)劇本的db名稱啟動
重啟所有服務
docker-compose restart 重啟所有的容器服務
重啟docker服務泼菌,容器全部退出 解決的辦法
方法一:docker run --restart=always 啟動容器是加上--restart=always 這個參數(shù) (docker服務啟動這個容器就會被拉起)
方法二:"live-restore": true 不建議使用 (宿主機已關(guān)機 容器就會死掉)
docker server配置文件/etc/docker/daemon.json參考
{
"registry-mirrors": ["http://b7a9017d.m.daocloud.io"],
"insecure-registries":["10.0.0.11:5000"],
"live-restore": true
}
docker run -d -p 80:80 10.0.0.11:5000/nginx:v1 sleep 7200秒
Docker網(wǎng)絡類型
查看容器的網(wǎng)絡類型
docker container inspect ID 或者主機名
None:不為容器配置任何網(wǎng)絡功能, --network=none
Container:與另一個運行中的容器共享Network Namespace啦租, --network container:ID(K8S)
Host:與宿主機共享Network Namespace哗伯,--network=host 性能最高 (端口容易沖突,IP地址一樣)
Bridge:Docker設(shè)計的NAT網(wǎng)絡模型 默認就是橋接網(wǎng)絡
Docker跨宿主機容器之間的通信macvlan
默認一個物理網(wǎng)卡篷角,只有一個物理mac地址焊刹,虛擬多個mac地址
創(chuàng)建macvlan網(wǎng)絡(容器宿主機都需要執(zhí)行 才能網(wǎng)絡互通)
docker network create --driver(指定網(wǎng)絡類型) macvlan --subnet(網(wǎng)絡范圍) 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0(基于那塊網(wǎng)卡做橋接) macvlan_1(網(wǎng)絡名字)
創(chuàng)建使用macvlan網(wǎng)絡的容器
docker run -it --network macvlan_1(指定網(wǎng)絡類型) --hostname web01(指定名字) --ip 10.0.0.200(指定ip地址) busybox:v1
##設(shè)置eth0的網(wǎng)卡為混雜模式 (ubantu 需要設(shè)置)
ip link set eth1 promisc on
Dcoker跨主機容器通信之overlay
docker01
vim /etc/docker/daemon.json 添加配置文件內(nèi)容
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.11:8500",(放在哪個主機上)
"cluster-advertise": "10.0.0.11:2376"(添加宿主機的節(jié)點 10.0.0.12:2376)
}
02上:
vim /etc/docker/daemon.json 添加配置文件內(nèi)容
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.11:8500",(放在哪個主機上)
"cluster-advertise": "10.0.0.12:2376"
}
后面步驟一樣改啟動配置文件 不用啟動progrium/consul
然后修改docker的啟動配置文件
vim /usr/lib/systemd/system/docker.service
修改前
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
重載守護進程
systemctl daemon-reload
重啟docker服務
systemctl restart docker
先拉取progrium/consul鏡像
然后倒入鏡像
啟動鏡像
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
consul:kv類型的存儲數(shù)據(jù)庫(key:value)
瀏覽器訪問10.0.0.11:8500 端口
docker network ls 查看網(wǎng)絡的類型
2)創(chuàng)建overlay網(wǎng)絡(加入節(jié)點的主機會自動添加 只需要在11上執(zhí)行即可)
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
3)啟動容器測試(兩臺主機)
docker run -it --network ol1 --name oldboy04 busybox /bin/sh
每個容器有兩塊網(wǎng)卡,eth0實現(xiàn)容器間的通訊,eth1實現(xiàn)容器訪問外網(wǎng)
docker01
docker run -it --network ol1 --name oldboy04 busybox /bin/sh
docker02
docker run -it --network ol1 --name oldboy05 busybox /bin/sh (主機名不能沖突,IP會自動分配)
/ # ping oldboy04
PING oldboy05 (172.16.1.1): 56 data bytes
64 bytes from 172.16.1.1: seq=0 ttl=64 time=0.364 ms
Docker企業(yè)級鏡像倉庫harbor(vmware 中國團隊)
第一步:安裝docker和docker-compose
第二步:下載harbor-offline-installer-v1.8.0.tgz
第三步:上傳到/opt,并解壓
cd /opt/
[root@docker01 opt]# tar xf harbor-offline-installer-v1.5.1.tgz
[root@docker01 opt]# cd harbor/
[root@docker01 harbor]# vim harbor.cfg
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.11 (如果有域名使用域名)
harbor_admin_password = 123456 登錄頁面的密碼 用戶為admin
第五步:執(zhí)行install.sh
如果某一個容器沒起來可以查看docker-compose.yml
查看對應服務的容器名稱
docker-compose +定義的容器名稱
訪問10.0.0.11即可 端口在vim docker-compose.yml 中修改nginx 端口
10.0.0.12上傳鏡像
修改docker配置文件
[root@docker02 ~]# vim /etc/docker/daemon.json
"insecure-registries": ["10.0.0.11"], 修改私有倉庫的ip不用加端口
先把鏡像打標簽
docker tag busybox:latest 10.0.0.11/library/busyboy:v1
docker login 登錄
docker push 10.0.0.11/library/busyboy:v1 上傳鏡像
docker pull 10.0.0.11/library/busyboy:v1 下載鏡像
docker logout 10.0.0.11 登出
配置harbor的證書 https
上傳證書到任意目錄
hostname = blog.qstack.com.cn
ui_url_protocol = https
ssl_cert = /opt/zheng/Nginx/1_blog.qstack.com.cn_bundle.crt
ssl_cert_key = /opt/zheng/Nginx/2_blog.qstack.com.cn.key
別人在上傳鏡像登錄需要 (別的docker配置文件不需要在調(diào)整)
[root@docker02 ~]# docker login blog.qstack.com.cn
[root@docker02 ~]# docker tag busybox:latest blog.qstack.com.cn/library/busyboy:v2 打標簽
[root@docker02 ~]# docker push blog.qstack.com.cn/library/busyboy:v2 上傳鏡像
下載無需登錄
[root@docker02 ~]# docker pull blog.qstack.com.cn/library/busyboy:v2 下載鏡像
1.8 https的 設(shè)置
https://github.com/goharbor/harbor/blob/master/docs/configure_https.md