docker-從入門到實踐
https://yeasy.gitbooks.io/docker_practice/repository/registry.html
docker基礎所有包下載
鏈接:https://pan.baidu.com/s/1TYH3RUFR3OiN6fX67sa5rg
提取碼:yy44
什麼叫虛擬化
正常服務器丨真實硬件層丨操作系統kernel丨shell層丨應用程序層
kvm丨真實硬件層丨虛擬化層丨Virual硬件層丨操作系統kernel丨shell層丨應用程序層
docker丨真實硬件層丨操作系統kernel丨分成一份一份的shell層丨分成一份一份的程序
LVM硬盤虛擬化
KVM硬件虛擬化(需要單獨裝操作系統,半虛擬化通過接口vitio)
Docker容器虛擬化(虛擬化後不需要裝操作系統,比KVM小的多)
一,Docker簡介,功能特性與應用場景
1.1 Docker簡介
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有以下幾個部分組成
Docker Client 客户端
Docker Daemon 守護進程
Docker Image 鏡像
Docker Container 容器
1.2 Docker功能特性
隔離環境(系統,網絡,文件系統)與應用
解決依賴與版本問題
易於分發,開箱即用
節點與容器快速擴容
鏡像製作簡單便捷,管理方便
(1)隔離
通過cgroup(隔離和跟蹤資源的使用)& namespace(組與組之間隔離)來實現輕量級的進程隔離
對於容器中運行的進程來説,自己獨佔了一個系統
容器間網絡,文件及其他資源都互相隔離
(2)版本與依賴
傳統模式下,多個不同環境或版本的項目需要部署在不同機器上,部署與後期維護管理複雜繁瑣。
使用Docker,通過多個不同版本或者環境的鏡像,可以同時運行在一台機器上互不干擾,部署與後期維護簡單方便。
(3)分發與使用
鏡像可以通過導入,導出,上傳到鏡像倉庫等多種方式進行分發
在啓動了Docker的系統上直接使用docker run即可啓動鏡像,無需特別配置。
(4)擴容
容器擴容簡單方便
擴容節點只需安裝並啓動Docker即可
(5)鏡像製作
鏡像的靈魂Dockerfile
使用Dockerfile進行指令控制
基於Linux命令,易於理解,快速上手
易於定製與修改
1.3 Docker應用場景
Docker通常應用於如下場景
web應用的自動化打包和發佈
自動化測試和持續集成,發佈
應用服務,如MySQL,Redis等,通過Docker實現快速部署
k8s私有云
1.3.1 場景1:多版本多種類系統與軟件
1.3.2 場景2: 環境
1.3.3 場景3: 分發
二,Docker的安裝(安裝社區版進行測試)
2.1 安裝環境
最小化安裝Centos7.5
cat /etc/redhat-release
uname -r
關閉防火牆和selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.2 版本選擇
Docker
17.03之後版本變為Docker CEDocker CE(測試選擇社區版)
社區版,Community EditionDocker EE
企業版,Enterprise Edition
收費版本,強調安全性,提供一些高級特性及商業支持
2.3 Docker安裝:標準版本(版本太低不用)
特別提示:
centos7.5在搭建本地yum倉庫的時候只需要修改
CentOS-Media.repo 文件即可(不需要將其他文件仍子目錄裏)
確保虛擬機能正常上網
[root@Docker ~]# yum -y install docker
[root@Docker ~]# systemctl start docker #啓動docker進程
[root@Docker ~]# systemctl enable docker #加入docker開機啓動
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@Docker ~]# docker ps #查看封裝在docker鏡像中的正在運行的鏡像進程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@Docker ~]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-63.git94f4240.el7.centos.x86_64
Go version: go1.9.4
Git commit: 94f4240/1.13.1
Built: Fri May 18 15:44:33 2018
OS/Arch: linux/amd64
Experimental: false
2.4 Docker安裝:CE社區版(清理docker方法)
首先清理掉yum安裝的docker標準版
這裏有兩種方式
#第一種清理docker方法
[root@Docker ~]# yum -y remove docker
#第二種清理docker方法
[root@Docker ~]# yum history list #查看yum安裝的歷史列表
已加載插件:fastestmirror
ID | 登錄用户 | 日期和時間 | 操作 | 變更數
-------------------------------------------------------------------------------
6 | root <root> | 2018-07-02 22:30 | Install | 17 EE #這次就是安裝的docker
5 | root <root> | 2018-07-02 20:08 | I, U | 60
4 | root <root> | 2018-07-03 03:54 | Install | 93
3 | root <root> | 2018-07-03 03:53 | Install | 1
2 | root <root> | 2018-07-03 03:53 | Install | 1
1 | 系統 <空> | 2018-07-03 03:46 | Install | 313
history list
[root@Docker ~]# yum history info 6 #查看yum歷史安裝ID為6的安裝信息
已加載插件:fastestmirror
事務 ID: 6
起始時間 : Mon Jul 2 22:30:11 2018
啓動 RPM 數據庫 : 409:3aba29f1d5b7e2d7ff3ed9f169ec4a2225595390
結束時間 : 22:30:27 2018 (16 秒)
結束 RPM 數據庫 : 426:28338758ec6a2332cabb3a1439336bd451c52366
用户 : root <root>
返回碼 : 成功
命令行 : -y install docker
事務完成屬主:
已安裝 rpm-4.11.3-32.el7.x86_64 @anaconda
已安裝 yum-3.4.3-158.el7.centos.noarch @anaconda
已安裝 yum-plugin-fastestmirror-1.1.31-45.el7.noarch @anaconda
已變更的包:
依賴安裝 audit-libs-python-2.8.1-3.el7.x86_64 @base
依賴安裝 checkpolicy-2.5-6.el7.x86_64 @base
依賴安裝 container-selinux-2:2.55-1.el7.noarch @extras
依賴安裝 container-storage-setup-0.9.0-1.rhel75.gite0997c3.el7.noarch @extras
安裝 docker-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依賴安裝 docker-client-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依賴安裝 docker-common-2:1.13.1-63.git94f4240.el7.centos.x86_64 @extras
依賴安裝 libcgroup-0.41-15.el7.x86_64 @base
依賴安裝 libsemanage-python-2.5-11.el7.x86_64 @base
依賴安裝 oci-register-machine-1:0-6.git2b44233.el7.x86_64 @extras
依賴安裝 oci-systemd-hook-1:0.1.15-2.gitc04483d.el7.x86_64 @extras
依賴安裝 oci-umount-2:2.3.3-3.gite3c9055.el7.x86_64 @extras
依賴安裝 policycoreutils-python-2.5-22.el7.x86_64 @base
依賴安裝 python-IPy-0.75-6.el7.noarch @base
依賴安裝 setools-libs-3.3.8-2.el7.x86_64 @base
依賴安裝 skopeo-containers-1:0.1.29-3.dev.git7add6fc.el7.0.x86_64 @extras
依賴安裝 yajl-2.0.4-4.el7.x86_64 @base
Scriptlet 輸出:
1 setsebool: SELinux is disabled.
history info
[root@Docker ~]# yum -y history undo 6 #進行yum安裝操作回退
特別提示:
yum的回退安裝在工作中很有用
安裝Docker的CE社區版
安裝依賴包
yum -y install yum-utils device-mapper-persistent-data lvm2
添加docker的CE版本的yum源配置文件
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
ll /etc/yum.repos.d/docker-ce.repo
安裝CE版本的docker
yum -y install docker-ce
systemctl start docker #啓動docker
systemctl enable docker #添加開機啓動
docker version #查看docker版本
三,Docker的操作命令
3.0 添加docker國內鏡像源
在開始學習docker之前,我們首先要更改一下docker的默認源鏡像下載地址(默認是從國外下載,很慢),我們需要添加國內的源地址
vim /etc/docker/daemon.json
cat /etc/docker/daemon.json
{"registry-mirrors":["https://registry.docker-cn.com"]}
systemctl daemon-reload
systemctl restart docker
3.1 Docker命令:search(查看鏡像)
用於從docker的官方公有鏡像倉庫查找鏡像
(1)查看Docker Hub上公開的centos鏡像
docker search centos
特別説明:Name:鏡像的名字:描述:星級(越高越好):是否是官方發佈的(OK代表官方發佈的):是否自動化的
(2)查找星級多於100的centos鏡像
查找,星級大於100的centos鏡像
docker search centos -f stars=100
特別提示:/:符號用於分割作者名稱和鏡像名稱/centos7-ansible:ansible是作者名稱,centos7-ansible是鏡像名稱
(3)多條件查找--filter
查找官方發佈的,星級大於100的centos鏡像
docker search centos --filter is-official=true --filter stars=100
3.2 Docker命令:pull(下載鏡像)
用於從Docker Hub上下載公有鏡像
docker pull nginx
docker pull richarvey/nginx-php-fpm
docker pull mysql:5.6
docker pull centos
3.3 Docker命令:images(查看本地鏡像)
用於本地鏡像的查看
docker images
特別説明::鏡像倉庫(下邊羅列的都是本地已有鏡像名稱):鏡像的標記(為了區分同名鏡像):鏡像的ID號:此鏡像的創建時間:此鏡像的大小
3.4 Docker命令:build(自定義)
用於本地自定義鏡像的構建,需要創建Dockerfile文件(只是創建,寫法在後面)
創建Dockerfile文件的存儲目錄
mkdir -p /root/dockerfile/lib/centos/7
cd /root/dockerfile/lib/centos/7
創建docker.sh腳本
vim docker.sh
cat docker.sh
#!/bin/bash-
whiletruedo"welcome"5done
創建Dockerfile配置文件,文件名稱必須為Dockerfile,第一個字母必須大寫
vim Dockerfile
cat Dockerfile
FROM centos-
LABEL MAINTATNER="Mr.sl.com"-
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai/etc/localtime-
ADD docker.sh /home/test/-
RUN chmod +x /home/test/docker.sh-
CMD ["/home/test/docker.sh"]
配置詳解-
FROM centos#從centos源鏡像的基礎上進行構建-
LABEL MAINTATNER="Mr.sl.com"#作者的名稱-
RUN ln -sfv /usr/share/zoneinfo/Asia/Shanghai/etc/localtime #RUN:f是強制覆蓋,v是有信息輸出,在鏡像構建過程中運行命令-
ADD docker.sh /home/test/#從本地系統中把docker.sh文件添加到構建中的鏡像的/home/test/目錄下-
RUN chmod +x /home/test/docker.sh#在鏡像構建過程中運行命令-
CMD ["/home/test/docker.sh"]#構建鏡像完成時,最後執行的命令
根據Dockfile配置文件構建一個自定義鏡像
docker build -t Mr.sl/centos7:1 . #-t 指定鏡像名稱 :1 設定鏡像的tag標記
docker images
3.5 Docker命令:run(運行鏡像)
運行一個本地鏡像
docker images
docker run -dit Mr.sl/centos7:1 /bin/bash --->/bin/bash代替配置文件裏面的CMD,可以不用寫
特別提示::運行一個指定的images id或鏡像名字-d:放在後台運行-i:可以進行命令交互-t:製作一個偽終端用於登陸0523fda5f122:鏡像的ID,可以簡寫成052
docker run -dit --name centos_test Mr.sl/centos7:1 --->不指定名字系統默認自己起名字
3.6 Docker命令:ps(看容器)
查看已經運行的鏡像的進程
docker ps -a #查看所有運行的鏡像進程(包含退出的exit)
特別提示::進程的狀態,UP表示正在運行中,EXIT表示已經退出了。
3.7 Docker命令:attach(切入)
從本地系統中切入到某個STATUS狀態是UP的鏡像進程裏
docker ps -a
docker attach 25c #切入到容器號為25c5cae76baf的鏡像進程裏
ls #已經進入容器裏了
exit #退出容器
docker ps -a
容器的進程的STATUS已經處於EXIT狀態(之前是後台運行的,切入進去後執行exit就等於手動退出了)
3.8 Docker命令:stop(停止)
用於停止一個正在運行着的容器進程
docker ps -a
docker stop 7d2
3.9 Docker命令:start(啓動)
用於啓動一個已經停止了的容器進程
docker ps -a
docker start 7d2 25c
3.10 Docker命令:rm(刪容器,需要先停止)
用於刪除一個已經停止了的容器進程
docker ps -a
docker rm 093e4fb8b09c
3.11 Docker命令:rmi(刪鏡像,給在沒有容器啓動的情況下)
用於刪除一個未用作容器啓動的本地鏡像
docker images
docker rmi -f 052 #-f 強制刪除(即便被佔用)
docker rmi 052 #但要注意,被用作容器啓動的鏡像是不能刪除的(需先rm刪除容器進程)
3.12 Docker命令:commit(更改並保存)
將一個更改過的容器進程的容器狀態保存為一個新的鏡像
docker ps -a #查看啓動的容器進程
docker attach 686 #切入容器進程
mkdir yunjisuan #在容器進程裏創建yunjisuan目錄
ls
exit #退出容器進程
docker commit 686 mr.sl/centos7:2 #將更改後的容器進程保存為一個新的鏡像
docker images
生產一個新的容器並切入查看結果
docker images
docker run -d -it 06e /bin/bash
docker ps -a #查看新鏡像的容器進程
docker attach 426 #切入新鏡像的容器進程
ls #我們發現之前創建的目錄仍舊存在
3.13 Docker命令:exec(不切入情況下執行命令或切入容器)
用於從本地操作系統上直接向容器進程發佈執行命令並返回結果
docker ps -a
docker exec 686 ls /tmp #查看容器進程裏的/tmp目錄下所有內容
用於從本地操作系統上切入向容器並退出不關閉方法
docker pa -a
docker exec -it 686 /bin/bash
exit
3.14 Docker命令:cp(複製)
用於在容器進程和本地系統之間複製文件
ls
touch xin
docker ps -a
docker exec 686 ls /tmp #向容器進程發佈命令
docker cp xin 686:/tmp
將指定容器進程的/tmp/yum.log複製到當前目錄下
docker exec 686 ls /tmp
docker cp 686:/tmp/yum.log . #將本地文件複製到容器進程裏
ls
3.15 Docker命令:create(創建容器,並不啓動zd)
用於創建一個容器進程,但是並不啓動它
docker images
docker create -it 148 #創建一個鏡像的容器進程,但不直接啓動
docker ps -a
docker start 5ed #啓動容器進程
docker ps -a
3.16 Docker命令:diff(做對比)
查看容器進程與源鏡像做對比,發生了改變的文件或文件夾
docker ps -a
cd /yunjisuan/
touch {1..6} #在容器進程中創建文件
ls
exit #退出容器進程
docker diff 686 #查看容器進程的變化
3.17 Docker命令:events(時時監測)
時時監測容器的變化情況
docker events
前台時時監控容器的變化若要檢測,需要另外再起一個窗口進行操作
3.18 Docker命令:export(導出容器)
將容器進程的文件系統導出到本地
docker ps -a
docker export ab06a9794e45 > centos.tar #將容器進程導出成一個tar包
ls
3.19 Docker命令:import(導入容器自動創建鏡像)
用於將export導出的文件系統創建為一個鏡像
ls
docker import centos.tar Mr.sl/centos:3
docker images
3.20 Docker命令:history(查看鏡像歷史記錄)
用於查看一個鏡像的歷史修改紀錄
docker images
docker history 148
3.21 Docker命令:info(查看docker運行信息)
用於查看當前操作系統的docker運行信息
docker info
Containers:1#容器進程1個Running:1#正在運行狀態的容器1個Paused:0Stopped:0Images:8#一共有8個鏡像
3.22 Docker命令:inspect(查看某個鏡像的詳細信息)
查看某個鏡像的詳細信息(json格式)
docker images
docker inspect 148
3.23 Docker命令:kill(強行停止容器)
強行停止一個或多個正在運行狀態的容器進程
docker ps -a
docker kill ab06a9794e45
3.24 Docker命令:save(導出鏡像)
用於將一個鏡像的文件系統導出到本地(export導出的是容器)
docker images
docker save test:1 > nginx.tar --->用ID號和鏡像名都可以
ls
3.25 Docker命令:load(導入鏡像)
用於將save導出到本地的tar包,重新加載為鏡像(和源鏡像的名字標識完全一樣)
docker images
ls
docker load < test.tar #將之前nginx這個鏡像的save備份導入系統
3.26 Docker命令:logs(看容器日誌)
用於輸出一個容器進程內的操作日誌
docker ps -a
docker logs 686
docker logs --tail 3 686 #只顯示容器日誌的後3行
3.27 Docker命令:pause && unpause(暫停和恢復)
用於將一個或多個容器的進程暫停和恢復
docker ps -a
docker pause 686 #暫停容器進程
docker unpause 686 #恢復容器進程
3.28 Docker命令:port(端口及協議)
用於列出一個容器的端口映射及協議
docker images
docker run -dit -p 2222:22 test:1 #啓動一個鏡像的容器進程 -p
docker ps -a
docker port 3b5 #查看容器進程的端口映射及協議
3.29 Docker命令:rename(容器重命名)
給容器進程重命名
docker ps -a
docker rename nginx_test nginx
3.30 Docker命令:restart(重啓)
重啓一個容器進程
docker ps -a
docker restart 686
3.31 Docker命令:stats(容器資源使用情況)
用於時時輸出容器的資源使用情況
docker ps -a
docker stats 686 --no-stream
3.32 Docker命令:tag(克隆鏡像)
用於從一個指定的鏡像創建另外一個鏡像
docker images
docker tag 62f test:2 #也可以指定鏡像名字
3.33 Docker命令:top(查看容器進程信息)
用於顯示指定容器的進程信息
docker ps -a
docker top 686
3.34 Docker命令:update(調整配置)
用於調整一個或多個容器的啓動配置
docker update --help
3.35 Docker命令:version and wait
version用於顯示docker的版本信息
docker version
wait用於捕捉一個或多個容器的退出狀態,並返回退出狀態碼
docker ps -a
docker wait 6321c3a3481f #需要在開一個窗口stop這個容器進程再查看
3.36 Docker命令:login && logout && push
login用於登陸docker hub官方公有倉庫
logout用於登出docker hub官方公有倉庫
push用於將本地鏡像提交到docker hub
由於docker hub國內已經無法註冊,因此無法演示上述內容
DockerHub官方公有鏡像倉庫:https://hub.docker.com/
四,管理應用程序數據
4.1 Volume和Bind Mount
將Docker主機數據掛載到容器
Docker提供三種不同方式將數據從宿主機掛載到容器中:volumes,bind mounts和tmpfs。
volumes:Docker管理宿主機文件系統的一部分(/var/lib/docker/volumes)
bind mounts:可以存儲在宿主機系統的任意位置
tmpfs:掛載存儲在宿主機系統的內存中,而不會寫入宿主機的文件系統
4.1.1 Volume(掛載卷)
docker volume ls
cd /var/lib/docker/volumes/
docker volume create nginx-vol
docker images
docker run -dit --name nginx-test -p 80:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker exec nginx-test ls /usr/share/nginx/html
docker exec nginx-test touch /usr/share/nginx/html/xin
cd nginx-vol/_data
ls
curl 127.0.0.1
特別説明-
--name #容器的名字-
--mount #掛載-
src #源卷的名字-
dst #掛載到容器中的路徑
4.1.2 Bind Mounts(綁定目錄)
mkdir -p /www/html
docker run -dit --name nginx-test1 -p 81:80 --mount type=bind,src=/www/html,dst=/usr/share/nginx/html nginx
docker ps -a
docker exec nginx-test1 ls /usr/share/nginx/html
echo "yunjisuan" > /www/html/index.html
curl 127.0.0.1:81
特別提示
bind mounts可以掛載宿主機上的任意目錄(創建的目錄要是沒有文件綁定以後對方也會沒有文件),而volume先得創建後才能掛載
4.1.3 批量刪除volume
使用 docker run -v 啓動的容器被刪除以後,在主機上會遺留下來孤單的卷。可以使用下面的簡單方法來做清理
docker volume ls -qf dangling=true
docker volume rm $(docker volume ls -qf dangling=true)
4.2 實戰容器部署LNMP網站平台
首先我們下載一個wordpress博客(上文有所有包)
wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
4.2.1 創建MySQL數據庫容器
下載MySQL5.6版本鏡像
docker pull mysql:5.6
docker images --->之前下載過了這裏就不重新下載了
創建一個自定義網絡
docker network create lnmp
docker network ls
b02d86520223 lnmp bridge local#默認驅動為網橋
啓動MySQL數據庫容器
docker run -dit --name lnmp_mysql --network lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=linyaonie mysql:5.6 --character-set-server=utf8
docker ps -a
特別提示
自定義網絡lnmp如果不提前創建的話,在啓動容器進程時會報錯如果沒有提前pull好mysql:5.6那麼容器在啓動時會自動下載對應鏡像如果沒有提前docker volume create mysql-vol,那麼容器啓動時會自動創建
查看容器lnmp_mysql的日誌輸出
docker logs lnmp_mysql
查看容器裏啓動的進程
docker top lnmp_mysql
4.2.2 向容器裏的Mysql創建一個庫並查看
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
docker exec -it lnmp_mysql /bin/bash
mysql -uroot -plinyaonie -e 'show databases;'
4.2.4 創建nginx+PHP環境容器
創建一個網頁目錄
mkdir -p /app/wwwroot
ll -d /app/wwwroot
下載richarvey/nginx-php-fpm鏡像
docker pull richarvey/nginx-php-fpm --->之前已經下好了
docker images
啓動richarvey/nginx-php-fpm鏡像的容器
docker run -dit --name lnmp_web --network lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
docker ps -a
4.2.5 解壓wordpress到網頁目錄/app/wwwroot下
ls
tar xf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot/
ls /app/wwwroot/
echo "yunjisuan" > /app/wwwroot/index.html
cat /app/wwwroot/index.html
4.2.6 博客wordpress訪問測試
通過瀏覽器進行docker宿主機的88端口的訪問測試
http://192.168.200.70:88
http://192.168.200.70:88/wordpress
特別提示
如果出現連接不上的情況,那麼請按順序執行以下命令一遍
systemctl stop firewalld
systemctl stop iptables.service
iptables -F
iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
如果多次連續訪問同一網頁,那麼瀏覽器有可能默認去掉指定的端口
若訪問不到,請查看是否指定了88端口