1、概念介紹 1.1 容器 1.1.1 介紹 容納其它物品的工具,可以部分或完全封閉,被用於容納、儲存、運輸物品。物體可以被放置在容器中,而容器則可以保護內容物。 1.1.2 要使用容器必須需要在內核級支持2中技術 namespaces 名稱空間 Control Group(cgroups) 控制組 ...
1、概念介紹
1.1 容器
1.1.1 介紹
容納其它物品的工具,可以部分或完全封閉,被用於容納、儲存、運輸物品。物體可以被放置在容器中,而容器則可以保護內容物。
1.1.2 要使用容器必須需要在內核級支持2中技術
- namespaces 名稱空間
- Control Group(cgroups) 控制組
(1)為什麼centos6 版本不能使用容器?
因為centos6 內核版本是2.6;容器需要一個user的名稱空間,直到內核3.8版本才有:
namespace | 系統調用參數 | 隔離內容 | 內核版本 |
UTS | CLONE_NEWUTS | 主機名和功能變數名稱 | 2.6.19 |
IPC | CLONE_NEWIPC | 信號量、消息隊列和共用記憶體 | 2.6.19 |
PID | CLONE_NEWPID | 進程編號 | 2.6.24 |
Network | CLONE_NEWNET | 網路設備、網路棧、埠等 | 2.6.29 |
Mount | CLONE_NEWNS | 掛載點(文件系統) | 2.4.19 |
User | CLONE_NEWUSER | 用戶和用戶組 | 3.8 |
(2)Control Group(cgroups)
- blkio:塊設備IO
- cpu:CPU
- cpuacct:CPU資源使用報告
- cpuset:多處理平臺上的CPU集合
- devices:設備訪問
- memory:記憶體用量及報告
- perf_event:對cgroup中的任務進行統一性能測試
- net_cls:cgroup中的任務創建的數據報文的類別標識符
1.2 docker
1.2.1 介紹
- Docker是一個開放源代碼軟體項目,讓應用程式佈署在軟體貨櫃下的工作可以自動化進行,藉此在Linux操作系統上,提供一個額外的軟體抽象層,以及操作系統層虛擬化的自動管理機制。
- Docker利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心名字空間(namespaces),來創建獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機造成的額外負擔。Linux核心對名字空間的支持完全隔離了工作環境中應用程式的視野,包括進程樹、網路、用戶ID與掛載文件系統,而核心的cgroup提供資源隔離,包括CPU、存儲器、block I/O與網路。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供界面的基礎上,開始包括libcontainer庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施,
- 依據行業分析公司“451研究”:“Dockers是有能力打包應用程式及其虛擬容器,可以在任何Linux伺服器上運行的依賴性工具,這有助於實現靈活性和便攜性,應用程式在任何地方都可以運行,無論是公有雲、私有雲、單機等。”
1.2.2 docker 運行架構
2、安裝啟動docker
2.1 安裝環境
(1)依賴的基礎環境
- 64 位CPU
- Linux kernel(內核) 3.10+
- Linux kernel cgroups and namespaces
(2)查詢自己伺服器的環境
① 使用的伺服器版本
[root@along ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
② 內核版本
[root@along ~]# uname -r
3.10.0-514.el7.x86_64
③ ip地址
[root@along ~]# hostname -I
192.168.130.101 192.168.10.101
2.2 安裝docker
2.2.1 使用官方安裝腳本自動安裝
實際上就是下載一個安裝腳本,再執行安裝(不推薦,因為不能選擇版本安裝)
[root@centos7 ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.2.2 CentOS 7 (使用yum進行安裝,推薦)
(1)添加docker-ce 源信息
[root@along ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
(2)修改docker-ce 源
[root@along ~]# sed -i '[email protected]@mirrors.tuna.tsinghua.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo
(3)更新並安裝 Docker-CE
[root@centos7 ~]# yum makecache fast
[root@centos7 ~]# yum -y install docker-ce 安裝的是預設最新版本
(4)安裝指定版本的docker
① 查看都有哪些版本
[root@centos7 ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
② 下載指定版本,我這裡下載的穩定版本
[root@centos7 ~]# yum -y install docker-ce-17.03.2.ce
③ 安裝報錯(虛擬機中可能會遇到,如果沒有報錯請忽略)
Error: Package: docker-ce-18.03.1.ce-1.el7.centos.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2.9
報錯原因: docker-ce-selinux 版本過低
解決辦法:在https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/網站下載對應版本的docker-ce-selinux,安裝即可
[root@along ~]# yum -y install https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.3.ce-1.el7.noarch.rpm
④ 再次安裝docker 成功
[root@centos7 ~]# yum -y install docker-ce-17.03.2.ce
2.2.3 Ubuntu 14.04 16.04 (使用apt-get進行安裝)
(1)安裝最新版本
# step 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟體源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
(2)安裝指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安裝指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]
2.3 啟動docker
2.3.1 配置docker鏡像加速
多種加速方式:
- docker cn
- 阿裡雲加速器
- 中國科技大學
- ... ...
(1)docker cn 加速
[root@along ~]# mkdir -p /etc/docker
[root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
(2)阿裡雲加速器
① 註冊阿裡雲賬號,專用加速器地址獲得路徑:
https://cr.console.aliyun.com/#/accelerator
② 添加加速器到配置文件
[root@along ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
EOF
③ 阿裡雲頁面有操作步驟
2.3.2 啟動docker服務
① 重載docker啟動配置
[root@along ~]# systemctl daemon-reload
② 將docker設為開機自啟
[root@along ~]# systemctl start docker.service
③ 啟動docker服務
[root@along ~]# systemctl enable docker.service
④ 查看docker版本
[root@along ~]# docker version
Client:
Version: 17.03.2-ce
API version: 1.27
Go version: go1.7.5
Git commit: f5ec1e2
Built: Tue Jun 27 02:21:36 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.2-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: f5ec1e2
Built: Tue Jun 27 02:21:36 2017
OS/Arch: linux/amd64
Experimental: false
3、docker 基礎命令操作
3.1 鏡像操作
3.1.1 搜索官方倉庫鏡像
[root@along ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 10659 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1497 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 671 [OK]
搜索結果解釋:
參數 |
說明 |
NAME |
鏡像名稱 |
DESCRIPTION |
鏡像說明 |
STARS |
點贊數量 |
OFFICIAL |
是否是官方的 |
AUTOMATED |
是否是自動構建的 |
3.1.2 拉取鏡像
(1)根據鏡像名稱(tag指定版本)拉取鏡像
[root@along ~]# docker pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
cd784148e348: Pull complete
12b08f7ef616: Pull complete
65071a4e699c: Pull complete
9936647427be: Pull complete
Digest: sha256:e3f77f7f4a6bb5e7820e013fa60b96602b34f5704e796cfd94b561ae73adcf96
Status: Downloaded newer image for nginx:1.14-alpine
[root@along ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
b4a6e23922dd: Pull complete
Digest: sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
Status: Downloaded newer image for busybox:latest
註:alpine 版本:構建容器小鏡像的髮型版本
(2)查看當前主機鏡像列表
[root@along ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 758ec7f3a1ee 7 days ago 1.15 MB
nginx 1.14-alpine c5b6f731fbc0 13 days ago 17.7 MB
3.1.3 導出鏡像
[root@along ~]# docker image save busybox > docker-busybox.tar.gz
[root@along ~]# ls docker-busybox.tar.gz
docker-busybox.tar.gz
[root@along ~]# docker image save -o /mnt/busybox_nginx.tar.gz busybox:latest nginx:1.14-alpine
[root@along ~]# ls /mnt/busybox_nginx.tar.gz
/mnt/busybox_nginx.tar.gz
註:
- -o:指定導出鏡像的位置;
- 可以同時導出多個鏡像;為一個文件;
- 指定.tar.gz 可以導出並壓縮。
3.1.4 刪除鏡像
[root@along ~]# docker image rm busybox
Untagged: busybox:latest
Untagged: busybox@sha256:8ccbac733d19c0dd4d70b4f0c1e12245b5fa3ad24758a11035ee505c629c0796
Deleted: sha256:758ec7f3a1ee85f8f08399b55641bfb13e8c1109287ddc5e22b68c3d653152ee
Deleted: sha256:23bc2b70b2014dec0ac22f27bb93e9babd08cdd6f1115d0c955b9ff22b382f5a
[root@along ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine c5b6f731fbc0 13 days ago 17.7 MB
3.1.5 導入鏡像
[root@along ~]# docker image load -i docker-busybox.tar.gz
23bc2b70b201: Loading layer 1.37 MB/1.37 MB
Loaded image: busybox:latest
[root@along ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 758ec7f3a1ee 7 days ago 1.15 MB
nginx 1.14-alpine c5b6f731fbc0 13 days ago 17.7 MB
3.1.6 查看鏡像的詳細信息
[root@docker01 ~]# docker image inspect centos
3.2 容器操作
3.2.1 啟動容器
方法1(不推薦):
先創建一個容器:docker create 鏡像名
再啟動容器:docker start 容器名
方法2:docker run 鏡像名
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
(2)options 常用命令選項
- -t :打開一個終端,像使用交換機一樣使用容器
- -i:互動式訪問
- --name:容器名字
- --network:指定網路
- --rm:容器一停,自動刪除
- -d:剝離與當前終端的關係;否則會一直占據著終端
- -p:埠映射,將容器內服務的埠映射在宿主機的指定埠
(3)示例:運行一個容器
[root@along ~]# docker run --name web1 -d -p 8888:80 nginx:1.14-alpine
ced78e522fd747635e9af01bc20882094e3b55ce50b9ae248962e8e8eeb89774
[root@along ~]# docker run --name b1 -it busybox /bin/sh 在運行容器時,互動式進入容器
/ # ls /
bin dev etc home proc root sys tmp usr var
/ # exit 退出
(4)查詢容器運行狀態命令
[root@along ~]# docker ps / docker container ls 兩個命令是一樣的效果
-a:查詢所有的容器
註:容器內的第一個進程必須一直處於運行的狀態,否則這個容器,就會處於退出狀態!
[root@along ~]# docker ps 只顯示運行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ced78e522fd7 nginx:1.14-alpine "nginx -g 'daemon ..." 5 minutes ago Up 5 minutes 0.0.0.0:8888->80/tcp web1
[root@along ~]# docker ps -a 查詢所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcbf3d772a65 nginx:1.14-alpine "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes 0.0.0.0:8888->80/tcp web1
9621f704b756 busybox "/bin/sh" 3 minutes ago Exited (0) 3 minutes ago b1
3.2.2 停止運行的容器
docker stop 關閉運行的容器
docker kill 殺死運行的容器
-s:指定信號,和kill 用法一樣;-9 強制停止容器
[root@along ~]# docker kill web1
web1
[root@along ~]# docker ps 只顯示運行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@along ~]# docker ps -a 查詢所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcbf3d772a65 nginx:1.14-alpine "nginx -g 'daemon ..." 5 minutes ago Exited (137) 1 second ago web1
9621f704b756 busybox "/bin/sh" 5 minutes ago Exited (0) 5 minutes ago b1
3.2.3 激活關閉的容器
docker start
(1)格式
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
(2)Options:
- -a:附加到當前終端
- -i:互動式
(3)示例
[root@along ~]# docker start web1
web1
[root@along ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ced78e522fd7 nginx:1.14-alpine "nginx -g 'daemon ..." 9 minutes ago Up 8 seconds 0.0.0.0:8888->80/tcp web1
3.2.4 查看容器的詳細信息
[root@along ~]# docker inspect web1 [root@along ~]# docker inspect web1 |grep "IPAddress" 比如我查詢到容器的ip "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2", [root@along ~]# curl 172.17.0.2 通過容器的IP,在宿主機上訪問服務 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> [root@along ~]# curl 127.0.0.1:8888 映射到宿主機的埠是8888 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1>
3.2.5 刪除容器
[root@along ~]# docker kill web1 先關閉容器,再刪除容器
b1
[root@along ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@along ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bcbf3d772a65 nginx:1.14-alpine "nginx -g 'daemon ..." 6 minutes ago Exited (137) 2 seconds ago web1
9621f704b756 busybox "/bin/sh" 6 minutes ago Exited (0) 6 minutes ago b1
[root@along ~]# docker rm web1
web1
[root@along ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9621f704b756 busybox "/bin/sh" 6 minutes ago Exited (0) 6 minutes ago b1
[root@along ~]# docker rm -f `docker ps -a -q` 刪除所有容器,-f 強制刪除
9621f704b756
[root@along ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3.2.6 對運行的容器執行指定命令exec
[root@along ~]# docker exec / docker container exec
(1)格式
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
(2)options 選項
- -d:在後臺運行命令
- -e:設置環境變數
- -i:互動式
- -t:打開一個終端
- -u:用戶名或UID
(3)示例
[root@along ~]# docker run --name web1 -d nginx:1.14-alpine 81f336e878c0fb3187596f2acd12705d94f532978a8ad37c9f8ae33cc39bfb61 ① 互動式進入容器 [root@along ~]# docker exec -it web1 /bin/sh / # ls / bin etc lib mnt root sbin sys usr dev home media proc run srv tmp var / # exit ② 查詢ip [root@along ~]# docker exec web1 ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe11:2/64 scope link valid_lft forever preferred_lft forever
3.2.7 查詢容器內部日誌
[root@along ~]# curl 172.17.0.2
[root@along ~]# docker logs web1
172.17.0.1 - - [03/Jan/2019:09:00:42 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
3.2.8 一圖總結對容器的操作命令