Docker的基本使用
1. Docker的安裝與啟動
1.1 安裝docker
這裡安裝在CentOS7.x以上版本,在CentOS6.x版本中,安裝前需要安裝其他許多環境而且Docker很多修補程式不支援更新。
(1)yum包更新到最新
sudo yum update
(2)安裝所需的軟體包。yum-utils 提供了 yum-config-manager ,並且 device mapper 存儲驅動程式需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)設置yum源為阿里雲或清華大學源
阿里云:sudo yum-config-manager --add-repo //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清華大學:sudo yum-config-manager --add-repo //mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
(4)安裝Docker社區版
sudo yum install docker-ce
(5)查看Docker版本
docker -v
1.2 設置ustc鏡像
docker 從 docker hub 拉取鏡像,因為是從國外獲取,速度較慢。可以通過配置中國鏡像源的方式,從中國獲取鏡像,提高拉取速度。這裡介紹使用
(1)編輯該文件,如果沒有該文件請先創建
vi /etc/docker/daemon.json
(2)在該文件中輸入如下內容
"registry-mirrors": ["//docker.mirrors.ustc.edu.cn"]

1.3 Docker的啟動與停止
systemctl命令是系統服務管理命令。
(1)啟動Docker
systemctl start docker
(2)停止Docker
systemctl stop docker
(3)重啟Docker
systemctl restart docker
(4)查看Docker狀態
systemctl status docker
(5)開機啟動
systemctl enable docker
(6)查看Docker概要資訊
docker info
(7)查看Docker幫助文檔
docker --help
2. 常用命令
2.1 鏡像相關命令
2.1.1 查看鏡像
(1)列出所有鏡像
docker images
(2)列出指定鏡像
docker image ls 鏡像名
docker images 鏡像名
REPOSITORY:倉庫
TAGE:標籤
IAMGE ID:鏡像ID
CREATED:創建時間
SIZE:鏡像大小
這些鏡像都是存儲在Docker宿主機的/var/lib/docker目錄下。
2.1.2 搜索鏡像
docker search 鏡像名稱
NAME :鏡像名稱
DESCRIPTION:鏡像描述
STARS:用戶評價,反應一個鏡像的受歡迎度
OFFICIAL:是否官方
AUTOMATED:自動創建,表示該鏡像有Docker Hub自動構建流程創建
2.1.3 拉取鏡像
(1)拉取鏡像是從中央倉庫下載鏡像到本地
docker pull 鏡像名稱
(2)例如,下載centos7鏡像
docker pull centos:7
如果不指定後面標籤(:7),其默認標籤為latest,即為最新鏡像。
2.1.4 刪除鏡像
(1)刪除指定鏡像,按鏡像ID刪除
docker rmi 鏡像ID
(2)刪除所有鏡像
docker rmi `docker images -q`
2.2 容器相關命令
2.2.1 查看容器
(1)查看正在運行的容器
docker ps
(2)查看所有容器
docker ps -a
(3)查看最後一次運行的容器
docker ps -l
(4)查看停止的容器
docker ps -f status=exited
2.2.2 創建和啟動容器
創建容器常用的參數說明:
創建容器命令:docker run
-
-i:表示運行容器
-
-t:表示容器啟動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個偽終端。
-
–name :為創建的容器命名。
-
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然後共享到容器上。
-
-d:在run後面加上-d參數,則會創建一個守護式容器在後台運行(這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建後就會自動進去容器)。
-
-p:表示埠映射,前者是宿主機埠,後者是容器內的映射埠。可以使用多個-p做多個埠映射。
(1)互動式方式創建容器。進入容器退出後,容器即運行停止。
docker run -it --name=容器名稱 鏡像名稱:標籤 /bin/bash
例如:
docker run -it --name=mycentos centos:7 /bin/bash
(2)退出當前容器
exit或CTRL+D
(3)守護式方式創建容器。進入容器在退出後,容器依舊運行。
docker run -di --name=容器名稱 鏡像名稱:標籤
(4)進入容器
docker exec -it 容器名稱(或者容器ID)/bin/bash
2.2.3 容器的啟動與停止
(1)停止容器
docker stop 容器名稱(或者容器ID)
(2)啟動容器
docker start 容器名稱(或者容器ID)
(3)創建容器時自啟
docker run -d --restart=always --name=設置容器名 使用的鏡像
(上面命令 –name後面兩個參數根據實際情況自行修改)
–restart具體參數值詳細資訊:
-
no: 默認策略,容器退出時不重啟容器;
-
on-failure:在容器非正常退出時(退出狀態非0)才重新啟動容器;
-
on-failure:3: 在容器非正常退出時重啟容器,最多重啟3次;
-
always:無論退出狀態是如何,都重啟容器;
-
unless-stopped:在容器退出時總是重啟容器,但是不考慮在 Docker 守護進程啟動時就已經停止了的容器。
(4)修改已有容器,使用update
docker update --restart=always 容器ID(或者容器名)
(容器ID或者容器名根據實際情況修改)
2.2.4 文件拷貝
(1)如果我們需要將文件拷貝到容器內可以使用cp命令
docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
(2)也可以將文件從容器內拷貝出來
docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
2.2.5 目錄掛載
在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。 創建容器 添加-v參數 後邊為 宿主機目錄:容器目錄,例如:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多級的目錄,可能會出現許可權不足的提示。
這是因為CentOS7中的安全模組selinux把許可權禁掉了,我們需要添加參數 –privileged=true 來解決掛載的目錄沒有許可權的問題。
2.2.6 查看容器 IP 地址
(1)我們可以通過以下命令查看容器運行的各種數據
docker inspect 容器名稱(容器ID)
(2)也可以直接執行下面的命令直接輸出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
2.2.7 實時查看docker容器的日誌
docker logs -f -t --tail -f 容器名稱(或者容器ID)
2.2.8 刪除容器
刪除容器前需要先停止要刪除的容器。
docker rm 容器名稱(容器ID)
3. 應用部署
3.1 MySQL部署
(1)拉取mysql鏡像
docker pull centos/mysql-57-centos7
(2)創建容器
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
-p 代表埠映射,格式為 宿主機映射埠:容器運行埠
-e 代表添加環境變數 MYSQL_ROOT_PASSWORD 是root用戶的登陸密碼
(3)進入mysql容器
docker exec -it tensquare_mysql /bin/bash
(4)登錄mysql並修改root密碼
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
(5)添加遠程登錄用戶
CREATE USER 'tanghuan'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'tanghuan'@'%';
(6)遠程登錄mysql
mysql -h 連接宿主機的IP -u 資料庫擁有的用戶名 -p
3.2 tomcat部署
(1)拉取鏡像
docker pull tomcat:7-jre7
(2)創建容器
-p表示地址映射埠,-v表示掛載目錄
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
(3)將本地war包拷貝到宿主機/usr/local/webapps路徑下完成部署
3.3 Nginx部署
(1)拉取鏡像
docker pull nginx
(2)創建Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
(3)進入Nginx容器中
docker exec -it mynginx /bin/bash
(4)查看nginx.conf配置文件
cat /etc/nginx/nginx.conf

可以看到其配置是外部導入的,方便分模組化的管理。
(5)查看默認配置文件default.conf
cat /etc/nginx/conf.d/default.conf

可以看到其歡迎頁的目錄是在/usr/share/nginx/html文件中。
(6)修改本地上傳的文件名為html,並複製到Nginx容器的/usr/share/nginx目錄中
mv 本地文件名 html
docker cp html mynginx:/usr/share/nginx
3.4 Redis部署
(1)拉取鏡像
docker pull redis
(2)創建容器
docker run -di --name=myredis -p 6379:6379 redis
(3)進入容器並通過 redis-cli 連接測試使用 redis 服務。
docker exec -it myredis /bin/bash

4. 備份與遷移
4.1 容器保存為鏡像
docker commit 容器名稱 鏡像名稱
例:docker commit mynginx mynginx_i
4.2 鏡像備份
將鏡像保存為文件
docker save -o 文件名 鏡像名
例:docker save -o mynginx.tar mynginx_i
-o:output
4.3 鏡像恢復與遷移
首先我們先刪除掉自己創建的mynginx_i鏡像,然後執行此命令進行恢復
docker load -i 文件名
例:docker load -i mynginx.tar
-i:輸入的文件
5. Dockerfile
5.1 什麼是Dockerfile
Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終創建一個新的鏡像。
1、對於開發人員:可以為開發團隊提供一個完全一致的開發環境; 2、對於測試人員:可以直接拿開發時所構建的鏡像或者通過Dockerfile文件構建一個新的鏡像開始工作了; 3、對於運維人員:在部署時,可以實現應用的無縫移植。
5.2 常用命令
| 命令 | 作用 |
|---|---|
| FROM image_name:tag | 定義了使用哪個基礎鏡像啟動構建流程 |
| MAINTAINER user_name | 聲明鏡像的創建者 |
| ENV key value | 設置環境變數 (可以寫多條) |
| RUN command | 是Dockerfile的核心部分(可以寫多條) |
| ADD source_dir/file dest_dir/file | 將宿主機的文件複製到容器內,如果是一個壓縮文件,將會在複製後自動解壓 |
| COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有壓縮文件並不能解壓 |
| WORKDIR path_dir | 設置工作目錄 |
6. 使用腳本創建 JDK8 鏡像
(1) 創建目錄
mkdir –p /usr/local/dockerjdk8
(2)下載 jdk-8u301-linux-x64.tar.gz 並上傳到伺服器(虛擬機)中的 /usr/local/dockerjdk8 目錄
(3)創建文件 Dockerfile (文件名必須是Dockerfile)
vi Dockerfile
(4)在Dockerfile 中編輯內容
# 依賴鏡像名稱和ID
FROM centos:7
# 指定鏡像創建者資訊
MAINTAINER tanghuan
# 切換工作目錄
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把java添加到容器中
ADD jdk-8u301-linux-x64.tar.gz /usr/local/java/
# 配置java環境變數
ENV JAVA_HOME /usr/local/java/jdk1.8.0_301
ENV JRE_HOME /usr/local/java/jdk1.8.0_301/jre
ENV PATH $JAVA_HOME/bin:$PATH
(5)執行命令構建鏡像
docker build -t 'jdk:1.8' .
-
-t:表示鏡像名:標籤
-
.:表示在當前目錄下找 Dockerfile 文件
(5)查看鏡像是否構建完成
docker images

7.Docker私有倉庫
Docker私有倉庫主要用於存放同一企業應用,在同一區域網下可以拉取鏡像。Docker私有倉庫本質上也是一個鏡像。
7.1 私有倉庫搭建與配置
(1)拉取私有倉庫鏡像
docker pull registry
(2)啟動私有倉庫容器
docker run -di --name=myregistry -p 5000:5000 registry
(3)訪問 //虛擬機ip:5000/v2/_catalog ,能看到 {「repositories」:[]} 表示創建成功,且倉庫內容為空
(4)修改 daemon.json,用於讓 Docker 信任私有倉庫地址
vi /etc/docker/daemon.json
(5)daemon.json添加如下內容
{
"insecure-registries":["192.168.190.139:5000"]
}

(6)重啟 Docker 服務
systemctl restart docker
7.2 鏡像上傳至私有倉庫
(1)標記此鏡像為私有倉庫的鏡像
docker tag 標籤名 IP:5000/鏡像名
例如:
docker tag jdk:1.8 192.168.190.139:5000/jdk1.8
(2)再次啟動私服容器
docker start myregistry
(3)上傳標記的鏡像
docker push IP:5000/標籤名
例如:
docker push 192.168.190.139:5000/jdk1.8
(4)再次訪問 //虛擬機ip:5000/v2/_catalog ,能看到 {「repositories」:[jdk1.8]} 表示上傳創建成功
(5)拉取標記的鏡像
docker pull IP:5000/標籤名
例如:
docker pull 192.168.190.139:5000/jdk1.8

