linux學習云計算-day2-docker容器

1.什么是容器2:容器和虛擬機的區(qū)別3:docker-ce的安裝4:docker主要內(nèi)容5:docker鏡像常用命令6:docker容器的常用命令7:docker端口映射8:docker數(shù)據(jù)卷9:手動制作docker鏡像10:自動制作docker鏡像11:docker鏡像的分層(復用,節(jié)省空間)12:dockerfile的優(yōu)化13:容器間的互聯(lián)14:單機版的容器編排15:私有倉庫docker-registry16: 企業(yè)級私有倉庫harbor(docker-compose)17:docker基礎(chǔ)網(wǎng)絡18:跨宿主機容器間的通訊之macvlan19:跨宿主機容器間的通訊之overlay

1.什么是容器

容器是隔離的環(huán)境中運行的一個進程,如果進程結(jié)束,容器就會停止,容器的隔離環(huán)境,擁有自己的ip地址,系統(tǒng)文件,主機名,進程管理

[圖片上傳失敗...(image-d42d01-1590990313541)]

程序: 代碼,軟件,命令

進程:正在運行的程序

2:容器和虛擬機的區(qū)別

虛擬機: 硬件cpu支持(vt虛擬化),模擬計算硬件,走正常的開機啟動

bios開機自檢--根據(jù)bios啟動項--讀取硬盤第一個扇區(qū)grub,uefi, centos7, 加載內(nèi)核,啟動系統(tǒng)第一個進程/sbin/init systemd

容器: 不需要硬件cpu的支持,共用宿主機內(nèi)核,啟動容器的第一個進程

容器優(yōu)勢: 啟動快,性能高,損耗少,輕量級

100虛擬機 100個服務 10宿主機

100容器 100個服務 6宿主機

3:docker-ce的安裝

主機名 內(nèi)存 ip
docker01 2G 10.0.0.11
docker02 2G 10.0.0.12

#安裝docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y
?
systemctl enable docker
systemctl start docker
?
#驗證
[root@docker01 yum.repos.d]# docker version 
Client: Docker Engine - Community
 Version:           19.03.5
 API version:       1.40
 Go version:        go1.12.12
 Git commit:        633a0ea
 Built:             Wed Nov 13 07:25:41 2019
 OS/Arch:           linux/amd64
 Experimental:      false

4:docker主要內(nèi)容
docker是一個cs架構(gòu), docker主要:鏡像 容器 倉庫 網(wǎng)絡 存儲 監(jiān)控

docker是一個軟件的打包技術(shù).

docker  run -d  -p 80:80  nginx:latest 
run 創(chuàng)建并啟動一個容器
-d  放后臺啟動
-p  端口映射
nginx:latest docker鏡像名稱

5:docker鏡像常用命令

docker search  搜索鏡像, 優(yōu)先選官方,stars數(shù)量多
docker pull    拉取鏡像(下載鏡像),注意版本
docker push    推送鏡像(上傳鏡像)
docker load    導入鏡像
   例子: docker load  -i  docker_nginx.tar.gz
docker save    導出鏡像
   例子:docker save centos:7 -o docker_centos7.tar.gz
docker image  ls   查看鏡像列表
docker rmi      刪除鏡像
docker tag      給鏡像打標簽

6:docker容器的常用命令

docker  run 創(chuàng)建并啟動容器
     例子:docker run  -d -it -p 80:80  nginx:latest
docker create  創(chuàng)建容器 --name
docker start   啟動容器
docker  stop   停止容器
docker  restart 重啟容器
docker  kill   強制停止容器
docker  ps     查看容器列表  -a 查看所有容器
docker  rm     刪除容器
    批量刪除所有容器 docker rm -f `docker ps -a -q`
docker  exec   進入正在運行的容器(分配一個新終端)
       例子: docker exec  -it  容器id/容器名字   /bin/bash(/bin/sh)
docker attach  進入正在運行的容器(使用相同的終端),偷偷離開的快捷鍵ctrl +p,ctrl +q

容器想要放在后臺一直運行的化,那么容器的初始命令,必須夯住(前臺運行),否則容器就會退出.

前臺運行
nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize

7:docker端口映射

docker run
-p  宿主機端口:容器端口
-p  宿主機ip1:宿主機端口:容器端口 (多個容器同時使用80端口)
-p  宿主機ip1::容器端口   隨機端口映射
-p  宿主機ip1::容器端口/udp   使用udp協(xié)議做隨機端口映射
-p 80:80  -p 3306:3306
-p 1111-1119:1111-1119  端口范圍映射
?
-P 自動隨機端口映射  

8:docker數(shù)據(jù)卷

docker run
-v  宿主機絕對目錄:容器目錄
-v  容器目錄        #創(chuàng)建一個隨機卷,來持久化容器的目錄下的數(shù)據(jù)
-v  卷名:容器目錄    #創(chuàng)建一個固定名字的卷,來持久化容器的目錄下的數(shù)據(jù)
--volumes-from  跟某一個容器掛載所有相同的卷

小練習: 只啟動一個nginx容器,要求訪問80端口,出現(xiàn)nginx默認歡迎首頁,訪問81端口,出現(xiàn)小鳥飛飛.
9:手動制作docker鏡像
制作一個基于centos6系統(tǒng)的nginx鏡像(單服務)

1:啟動一個純凈的centos:6.9容器,安裝nginx
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum install nginx -y
2:把安裝好服務的容器,提交為鏡像
docker container commit eb109f194821 centos6.9_nginx:v1
?
3:測試鏡像的功能
docker run -d  -p 82:80 centos6.9_nginx:v1 nginx -g 'daemon off;'

制作一個基于centos6系統(tǒng)的kod網(wǎng)盤的鏡像(多服務)

1:啟動一個centos6.9_nginx:v1,再安裝php
echo '192.168.12.201  mirrors.aliyun.com' >>/etc/hosts
yum install php-fpm php-gd php-mbstring -y
vi /etc/php-fpm.d/www.conf
service php-fpm start
cd /etc/nginx/conf.d/
vi default.conf 
mkdir /html
cd /html
curl -o kodexplorer4.40.zip http://192.168.12.201/191216/kodexplorer4.40.zip
yum install unzip -y
unzip kodexplorer4.40.zip 
chown -R nginx:nginx .
?
vi /init.sh
#!/bin/bash
?
service php-fpm start
nginx -g 'daemon off;'
?
2:把安裝好服務的容器,提交為鏡像
docker commit 47208e3e3796 kod:v2
3:測試鏡像的功能
docker run -d -p 83:80 kod:v2 /bin/bash /init.sh

制作一個基于centos7系統(tǒng)的nginx+sshd雙服務鏡像

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install nginx -y
yum install openssh-server -y
yum install initscripts -y
/usr/sbin/sshd-keygen
echo '123456'|passwd --stdin root
/usr/sbin/sshd -D
vi /init.sh

10:自動制作docker鏡像
鏡像: 中藥

dockerfile: 配方

dockerfile常用指令

FROM  基礎(chǔ)鏡像
RUN   制作鏡像過程中需要的執(zhí)行命令(安裝服務)
CMD   容器啟動的時候執(zhí)行的初始命令,容易被替換(啟動服務)
ENTRYPOINT  容器啟動的時候執(zhí)行的初始命令,不能被替換,如果同時使用CMD和ENTRYPOINT,cmd命令將作為ENTRYPOINT命令的參數(shù)
ADD   把dockerfile當前目錄下的文件拷貝到容器中(自動解壓tar包)
COPY  把dockerfile當前目錄下的文件拷貝到容器中(不解壓tar包)
WORKDIR 指定容器的默認工作目錄
EXPOSE  鏡像要暴露的端口
VOLUME  持久化卷
ENV     環(huán)境變量(ssh的密碼,數(shù)據(jù)庫的密碼)
LABEL       鏡像的屬性標簽
MAINTAINER  管理者標識

根據(jù)dockerfile自動構(gòu)建鏡像的思路

a:手動制作docker鏡像,記錄歷史命令
b:根據(jù)歷史命令編寫dockerfile文件
c:docker build構(gòu)建docker鏡像
d:測試鏡像的功能

dockerfile單服務例子1:

FROM centos:6.9
RUN echo '192.168.19.200  mirrors.aliyun.com' >>/etc/hosts
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;"]

dockerfile多服務例子2:

FROM centos6.9_nginx:v1
RUN yum install php-fpm php-gd php-mbstring -y
ADD www.conf /etc/php-fpm.d/www.conf
ADD default.conf /etc/nginx/conf.d/default.conf 
RUN mkdir /html
WORKDIR /html
RUN curl -o kodexplorer4.40.zip http://192.168.19.200/191127/kodexplorer4.40.zip
RUN yum install unzip -y
RUN unzip kodexplorer4.40.zip 
RUN chown -R nginx:nginx .
ADD init.sh   /init.sh
?
CMD ["/bin/bash","/init.sh"]
?
vi /init.sh
#!/bin/bash
?
service php-fpm start
nginx -g 'daemon off;'

dockerfile使用環(huán)境變量的例子:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh  /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]
?
vi  init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
    SSH_PWD=$1
fi
?
echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D

11:docker鏡像的分層(復用,節(jié)省空間)
12:dockerfile的優(yōu)化

a: 使用體積小的linux鏡像alpine
b:盡可能的清理無用的緩存文件(盡可能把多個RUN合并)
c:修改dockerfile的時候,盡可能把修改的內(nèi)容放在最后
d:使用.dockerignore忽略構(gòu)建docker鏡像時,不需要的文件

13:容器間的互聯(lián)
docker run --link 正在運行容器的名字(單方向)

docker run --name mysql-server -it \
      -e MYSQL_DATABASE="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

14:單機版的容器編排
yum install docker-compose -y(需要epel源)

version: '3'
?
services:
   mysql-server:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root_pwd
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
     command: --character-set-server=utf8 --collation-server=utf8_bin
     
   zabbix-java-gateway:
     image: zabbix/zabbix-java-gateway:latest
     restart: always
     
   zabbix-server:
     depends_on:
       - mysql-server
     image: zabbix/zabbix-server-mysql:latest
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
       ZBX_JAVAGATEWAY: zabbix-java-gateway
     ports:
       - "10051:10051"
       
   zabbix-web-nginx-mysql:
     depends_on:
       - zabbix-server
     image: zabbix/zabbix-web-nginx-mysql:latest
     ports:
       - "80:80"
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd

docker-compose up -d 啟動服務

docker-compose down 停止服務

15:私有倉庫docker-registry

#啟動私有倉庫
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
?
#鏡像地址
nginx:1.15        官方倉庫的官方鏡像
nginx/nginx:1.15  官方倉庫的用戶鏡像
?
daocloud.io/nginx/nginx:1.15  私有倉庫的鏡像
?
#上傳鏡像
docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
docker image push 10.0.0.11:5000/alpine:3.9
#第一次上傳鏡像會報錯
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"],
  "insecure-registries": ["10.0.0.11:5000"]
}
?
systemctl  restart docker
?
docker image push 10.0.0.11:5000/alpine:3.9
?
?
#下載鏡像
docker image pull 10.0.0.11:5000/alpine:3.9

16: 企業(yè)級私有倉庫harbor(docker-compose)

#下載安裝器
https://github.com/goharbor/harbor/releases/download/v1.10.0/harbor-offline-installer-v1.10.0.tgz
#解壓
[root@docker01 opt]# tar xf harbor-offline-installer-v1.8.0.tgz 
#修改配置文件
cd  harbor
vim harbor.yml
hostname: 10.0.0.12
harbor_admin_password: 123456
#執(zhí)行安裝腳本
 ./install.sh

為harbor配置https證書

#修改harbor.yml
#配置域名
hostname: blog.oldqiang.com
?
#配置證書
https:
  port: 443
  certificate: /opt/certs/nginx/1_blog.oldqiang.com_bundle.crt
  private_key: /opt/certs/nginx/2_blog.oldqiang.com.key
?
#重新執(zhí)行安裝腳本
./install.sh

17:docker基礎(chǔ)網(wǎng)絡
四種基礎(chǔ)網(wǎng)絡類型

bridge  默認類型 NAT模式
host    host類型,使用宿主機網(wǎng)絡,網(wǎng)絡性能最高
container 容器類型。使用其他容器共用網(wǎng)絡,k8s中使用
none    沒有網(wǎng)絡,上不了外網(wǎng)

創(chuàng)建自定義網(wǎng)絡

docker network create -d bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 oldqiang

18:跨宿主機容器間的通訊之macvlan
macvlan類似與虛擬機的橋接網(wǎng)絡

#創(chuàng)建網(wǎng)絡
docker network create -d macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
?
#啟動容器
docker run -it --network macvlan_1 --ip 10.0.0.105 alpine:3.9 

19:跨宿主機容器間的通訊之overlay

docker03上: consul存儲ip地址的分配
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
?
docker01、02上:
vim  /etc/docker/daemon.json
{
  "cluster-store": "consul://10.0.0.13:8500",
  "cluster-advertise": "10.0.0.11:2376"
}
?
systemctl restart docker
?
2)創(chuàng)建overlay網(wǎng)絡
docker network create -d overlay --subnet 172.26.0.0/16 --gateway 172.26.0.1  ol1
?
3)啟動容器測試
docker run -it --network ol1 --name oldboy01  alpine:3.9  /bin/sh
每個容器有兩塊網(wǎng)卡,eth0實現(xiàn)容器間的通訊,eth1實現(xiàn)容器訪問外網(wǎng)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容