Docker

簡介

使用最廣泛的開源容器引擎
一種操作系統級的虛擬化技術
依賴於Linux內核特性:Namespace(資源隔離)和Cgroups(資源限制)
一個簡單的應用程序打包工具

設計目標

提供簡單的應用程序打包工具
開發人員和運維人員職責邏輯分離
多環境保持一致性

基本組織

在這裏插入圖片描述

應用場景

應用程序打包和發佈
應用程序隔離
持續集成
部署微服務
快速搭建測試環境
提供PaaS產品(平臺即服務)

虛擬機與docker

在這裏插入圖片描述
在這裏插入圖片描述

docker版本

社區版(Community Edition,CE),一般使用都社區版
企業版(Enterprise Edition,EE)
CE當前只支持 CentOS7

安裝

yum install -y yum-utils device-mapper-persistent-data lvm2 # 安裝依賴包
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 添加Docker軟件包源
yum install -y docker-ce # 安裝Docker CE
systemctl start docker # 啓動Docker服務並設置開機啓動
systemctl enable docker
docker info #查看當前版本與信息
docker ps #查看容器運行
docker run –it nginx #下載並運行nginx容器 ,-i: 以交互模式運行容器,通常與 -t 同時使用; -t: 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用; 
docker inspect 容器ID #查看容器ip等信息
docker exec –it 容器ID bash #進入容器

#鏡像
什麼是鏡像?
簡單說,Docker鏡像是一個不包含Linux內核(共享宿主機的)而又精簡的Linux操作系統。
鏡像從哪裏來?
Docker Hub是由Docker公司負責維護的公共註冊中心,包含大量的容器鏡像,Docker工具默認從這個公共鏡像庫下載鏡像。
https://hub.docker.com/explore
默認是國外的源,下載會慢,建議配置國內鏡像倉庫

# vi /etc/docker/daemon.json 
{
  "registry-mirrors": [ "https://registry.docker-cn.com"]
}
systemctl restart docker #重啓生效
docker images #查看本地鏡像
docker pull nginx #下載鏡像到本地,默認是latest。要指定版本docker pull nginx:1.12
docker history nginx #查看鏡像

##鏡像與容器聯繫
在這裏插入圖片描述
鏡像不是一個單一的文件,而是有多層構成。我們可以通過docker history <ID/NAME> 查看鏡像中各層內容及大小,每層對應着Dockerfile中的一條指令。Docker鏡像默認存儲在/var/lib/docker/中。CentOS中是torage-driver是overlay2
容器其實是在鏡像的最上面加了一層【讀寫層】,在運行容器裏做的任何文件改動,都會寫到這個讀寫層。如果容器刪除了,最上面的讀寫層也就刪除了,改動也就丟失了。
Docker使用存儲驅動管理鏡像每層內容及可讀寫層的容器層。

存儲驅動

在這裏插入圖片描述
overlay2 docker自帶,當前性能最好。

鏡像管理

指令與描述

ls		列出鏡像
build	構建鏡像來自Dockerfile
history	查看鏡像歷史
inspect	顯示一個或多個鏡像詳細信息
pull	從鏡像倉庫拉取鏡像
push	推送一個鏡像到鏡像倉庫
rm		移除一個或多個鏡像
prune	移除未使用的鏡像。沒有被標記或被任何容器引用的。
tag		創建一個引用源鏡像標記目標鏡像
export	導出容器文件系統到tar歸檔文件
import	導入容器文件系統tar歸檔文件創建鏡像
save	保存一個或多個鏡像到一個tar歸檔文件
load	加載鏡像來自tar歸檔或標準輸入

例子

docker image pull nginx:1.11 #拉鏡像
docker image rm nginx:1.12 #移除鏡像
docker images #查看倉庫
docker tag nginx:1.11 nginx:v1 #打標記
docker image save nginx:1.11 > nginx.11.tar #導出的是一個鏡像
docker load < nginx.11.tar #導入鏡像
docker run –itd busybox #創建一個窗口 –d是後臺運行容器
docker ps #查看容器運行
docker export 容器ID > busybox.tar #導出的是一個容器
docker image import busybox.tar  busybox:self #導入 

容器管理

指令與描述

指令					描述				資源限制指令				描述
-i, --interactive		交互式				-m,--memory			容器可以使用的最大內存量
-t, --tty				分配一個僞終端		--memory-swap			允許交換到磁盤的內存量
-d, --detach 			運行容器到後臺		--memory-swappiness=<0-100>		容器使用SWAP分區交換的百分比(0-100,默認爲-1)
-a, --attach list		附加到運行的容器		--memory-reservation	內存軟限制,Docker檢測主機容器爭用或內存不足時所激活的軟限制,使用此選項,值必須設置低於—memory,以使其優先
--dns list				設置DNS服務器		--oom-kill-disable	當宿主機內存不足時,內核會殺死容器中的進程。建議設置了-memory選項再禁用OOM。如果沒有設置,主機可能會耗盡內存
-e, --env list			設置環境變量			--cpus	限制容器可以使用多少可用的CPU資源
--env-file list			從文件讀取環境變量	--cpuset-cpus	限制容器可以使用特定的CPU
-p, --publish list		發佈容器端口到主機	--cpu-shares	此值設置爲大於或小於默認1024值,以增加或減少容器的權重,並使其可以訪問主機CPU週期的更大或更小比例
-P, --publish-all		發佈容器所有EXPOSE的端口到宿主機隨機端口		
-h, --hostname string	設置容器主機名		
--ip string				指定容器IP,只能用於自定義網絡		
--link list				添加連接到另一個容器		
--network				連接容器到一個網絡		
--mount mount			掛載宿主機分區到容器		
-v, --volume list		掛載宿主機目錄到容器		
--restart string		容器退出時重啓策略,默認no
[always|on-failure]		
--add-host list			添加其他主機到容器中/etc/hosts		

例子

docker container run –itd –name bs busybox #創建容器,-name指定名稱
docker container attach bs #進入容器(創建docker 時宿主機會同時啓動一個docker0的網卡,同時在宿主機上會掛載三個文件/etc/solv.conf,/etc/hostname,/etc/hosts,在容器中修改這套一個文件,重啓後就失效)ctrl+p+q 退出容器,但容器繼續執行
docker container run –itd –e abc=123  –name bs1 busybox #創建容器,並傳遞一個變量
docker exec –it bs1 sh #進入容器
docker container run –itd –p 8080:80 –name nginx01 nginx #創建容器,並將容器80端口暴露到宿主機上80
docker logs nginx #查看日誌,文件本身保存在/var/lib/docker/containers/容器ID/xx-json.log 下,以json格式
docker ps –a #查看所有容器,包括沒有運行的
docker container run –itd –p 8081:80 –name nginx02 –restart=always nginx #當容器中程序停止導致容器退出時,再重啓容器
docker container run –itd –cpus 1 –name nginx04 nginx #此容器只能使用單核CPU
docker container run –itd –memory 512m –name nginx05 nginx #指定內存,同時swap爲內存的2倍,設置了內存大小最好再去設置oom,否則容器資源利用高會自動殺進程
docker container stats nginx05 #查看資源利用率

容器命令

指令		描述
ls			列出容器
inspect		顯示一個或多個容器詳細信息
attach		附加本地標準輸入,輸出和錯誤到一個運行的容器
exec		在運行容器中執行命令
commit		創建一個新鏡像來自一個容器
cp			拷貝文件/文件夾到一個容器
logs		獲取一個容器日誌
port		列出或指定容器端口映射
stats		顯示容器資源使用統計
top			顯示一個容器運行的進程
update		更新一個或多個容器配置
stop/start	停止/啓動一個或多個容器
rm			刪除一個或多個容器

docker container ls #查看當前運行容器
docker container inspect 容器ID#容器PID、容器名、資源限制、IP、掛載等信息
docker container top nginx03 #查看03中運行的進程
docker container exec –it ngingx03 bash #進入到已經運行進程的容器
docker container port nginx01 #查看端口

容器最好自身不做改動(不使用commit等操作),只通過dockerfile來配置

管理應用程序數據

需求:容器刪除後,數據庫中數據不丟。
docker採用數據捲來實現。
Docker提供三種不同的方式將數據從宿主機掛載到容器中:volumes,bind mounts和tmpfs。
volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)。
bind mounts:可以存儲在宿主機系統的任意位置。
tmpfs:掛載存儲在宿主機系統的內存中,而不會寫入宿主機的文件系統。
在這裏插入圖片描述

volume

docker volume –help #查看幫助
docker volume ls #查看volume

管理卷

docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol

用卷創建一個容器

docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx #--mount指定數據卷用哪個,src是哪個數據卷(也就是宿主機目錄),dst數據卷掛到容器哪個位置,如果沒有指定卷,自動創建匿名卷。建議使用-mount,更通用。
docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx #不推薦使用這種

清理

docker container stop nginx-test
docker container rm nginx-test  
docker volume rm nginx-vol
docker container rm –f $(docker ps –q –a) #刪除所有容器

多容器使用同一個卷

docker run -d -it --name=nginx-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx #使用相同命令,只容器名稱不同(體現擴展性強)

Bind Mounts

用卷創建一個容器

docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx #如果源文件/目錄沒有存在,不會自動創建,會拋出一個錯誤。如果掛載目標在容器中非空目錄,則該目錄現有內容將被隱藏。
驗證綁定
docker inspect nginx-test
清理
docker container stop nginx-test 
docker container rm nginx-test 

搭建LNMP

1、自定義網絡

docker network create lnmp #用於通信使用
docker network ls #查看網絡

2、創建Mysql數據庫容器

docker run -itd \
--name lnmp_mysql \
--net lnmp \
-p 3306:3306 \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 --character-set-server=utf8 

3、創建所需數據庫

docker exec lnmp_mysql sh \
-c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"' #-c向容器發佈命令配置數據庫

4、創建PHP環境容器

docker run -itd \
--name lnmp_web \
--net lnmp \
-p 88:80 \
--mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm

5、以wordpress博客爲例測試

wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
tar zxf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot #app/wwwroot是宿主機目錄,也是PHP容器綁定的宿主機目錄,wordpress中有wp-config.php中配置連接數據庫相關配置
# 瀏覽器測試訪問
http://IP:88/wordpress

網絡模式

Docker支持5種網絡模式
bridge:默認網絡,Docker啓動後默認創建一個docker0網橋,默認創建的容器也是添加到這個網橋中。
host:容器不會獲得一個獨立的network namespace,而是與宿主機共用一個。
none:獲取獨立的network namespace,但不爲容器進行任何網絡配置。
container:與指定的容器使用同一個network namespace,網卡配置也都是相同的。
自定義:自定義網橋,默認與bridge網絡一樣。
在這裏插入圖片描述

docker network ls #查看所有網絡
docker inspect nginx-test #能夠查看到默認是橋接網絡
docker run -itd –name bs1 –net host busybox #指定爲host網絡創建一個容器test01
docker run –itd –name bs1 –net none busybox #容器中只有一個lo網卡

Dockerfile

在這裏插入圖片描述

mkdir test
vim Dockerfile
FROM centos:7 #來自於哪個鏡像
MAINTAINER www.yayun.com #作者信息
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel #執行shell命令
ADD php-5.6.31.tar.gz /tmp/ #將壓縮包放入到容器中並自動解壓,不推薦直接從網上拉
RUN cd /tmp/php-5.6.31 && \
    ./configure --prefix=/usr/local/php \
    --with-config-file-path=/usr/local/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /usr/local/php/etc/php-fpm.conf && \
    sed -i "21a \daemonize = no" /usr/local/php/etc/php-fpm.conf
COPY php.ini /usr/local/php/etc #與ADD區別是隻有拷貝不能解壓
RUN rm -rf /tmp/php-5.6.31* && yum clean all
WORKDIR /usr/local/php
EXPOSE 9000 #聲明端口
CMD ["./sbin/php-fpm", "-c", "/usr/local/php/etc/php-fpm.conf"] #運行容器時執行

構建鏡像

構建前,一個容器對應一個目錄,目錄中包括Dockerfile,壓縮包,配置文件(方便修改)
Dockerfile文件
nginx Dockerfile

FROM centos:7
MAINTAINER www.yayun.com
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel
ADD nginx-1.12.1.tar.gz /tmp
RUN cd /tmp/nginx-1.12.1 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all
COPY nginx.conf /usr/local/nginx/conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]

構建nginx鏡像(構建php鏡像類似使用對應Dockerfile)

docker image build –t nginx:v1 –f Dockerfile . #-t指定鏡像的REPOSITORY與TAG。.代表上下文,也就是Dockerfile中指定的壓縮包,配置文件在宿主機當前哪個位置。其中nginx:v1爲構建的鏡像。

構建PHP網站環境

1、自定義網絡

docker network create lnmp #相當容器放到一個網絡中,可通過容器名,主機名進行通信

2、創建PHP容器

docker run -itd \
--name lnmp_php \
--net lnmp \
--mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html \
php:v1 

3、創建Nginx容器

docker run -itd \
--name lnmp_nginx \
--net lnmp \
--mount type=bind,src=/app/wwwroot/,dst=/usr/local/nginx/html \
nginx:v1 #nginx容器的src目錄要與php的src一致,nginx通過fastcgi_lass參數中的php主機名來訪問

4、創建MySQL容器

docker run -itd \
--name lnmp_mysql \
--net lnmp \
-p 3306:3306 \
--mount src=mysql-vol,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql --character-set-server=utf8
# mysql是通過docker_entrypoint腳本來接收-e參數

構建JAVA網站

tomcat Dockerfile

FROM centos:7
MAINTAINER www.yayun.com 
ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45
ADD apache-tomcat-8.0.46.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
RUN rm -f /usr/local/*.tar.gz
WORKDIR /usr/local/apache-tomcat-8.0.46
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]

構建鏡像

docker build –t tomcat:v1

創建容器

docker run -itd \
--name=tomcat \
-p 8080:8080 \
--mount type=bind,src=/app/webapps/,dst=/usr/local/apache-tomcat-8.0.46/webapps \
tomcat:v1

Harbor

Harbor是VMware公司開源的企業級Docker Registry項目

特點

基於角色的訪問權控制,創建用戶分配不同權限訪問私有庫。
鏡像複製,兩個Harbor同步
刪除鏡像
可基於https或http(一般是https)

安裝步驟

1.下載離線包。
2.安裝Docker
3.安裝docker-compose
4.自籤TLS證書
5.Harbor安裝與配置
6.Docker主機訪問Harbor

chmod +x docker-compose #將docker-compose解壓後添加權限
mv docker-compose /usr/bin #將文件移動可執行目錄
tar –xvf harbor.v1.4.0.tar.gz #將harbor離線包解壓
mkdir ssl
cd ssl
openssl genrsa -out ca.key 4096 #生成一個CA的key
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
 -key ca.key \
 -out ca.crt #生成一個CA的crt
openssl genrsa -out yourdomain.com.key 4096 #生成自己域名的key
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key yourdomain.com.key \
    -out yourdomain.com.csr #生成自己域名的csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF # 生成一個openssl命令需要的外部配置文件

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in yourdomain.com.csr \
-out yourdomain.com.crt #通過之前準備好的v3.ext和csr生成crt
openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert #將服務端的crt轉換成客戶端用的cert
cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
cp ca.crt /etc/docker/certs.d/yourdomain.com/ #將域名的cert,key和ca.crt拷貝到docker client所在主機的
systemctl restart docker 

在這裏插入圖片描述

./prepare #根據配置文件生成所需文件
./install.sh #安裝
docker-compose ps #查看當前鏡像(通過docker-compose.yml運行)
docker login yourdomain.com #登錄Harbor
docker images #查看鏡像
docker tag tomcat:v1 yourdomain.com/test/tomcat:v1 #在項目中標識鏡像
docker push yourdomain.com/test/tomcat:v1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章