目錄
Docker使用
CentOS
設置鏡像源
cd /etc/docker/
vi daemon.json
systemctl daemon.json
systemctl daemon-reload
systemctl restart docker
yum緩存
我們在更新yum源或者出現配置yum源之后,通常都會使用yum makecache 生成緩存
-
yum makecache fast
這個命令是將軟件包信息提前在本地緩存一份,用來提高搜索安裝軟件的速度
-
yum clean all
yum 會把下載的軟件包和header存儲在cache中而不自動刪除。如果覺得占用磁盤空間,可以使用yum clean指令清除緩存。
Ubuntu
把當前用戶添加到docker用戶組
- 創建docker用戶組
- sudo groupadd docker
- 將普通用戶加入docker用戶組
- sudo usermod -a -G docker $USER
- sudo gpasswd -a ${USER} docker
- 重啟docker服務
- sudo service docker restart
- 刷新docker組成員
- newgrp - docker
Docker鏡像使用
當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載
- 管理和使用本地 Docker 主機鏡像
- 創建鏡像
列出鏡像列表
docker images
各個選項說明:
REPOSITORY:表示鏡像的倉庫源
TAG:鏡像的標簽
IMAGE ID:鏡像ID
CREATED:鏡像創建時間
SIZE:鏡像大小
同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如 python 倉庫源里,有 等多個不同的版本,我們使用 REPOSITORY:TAG 來定義不同的鏡像。
所以,我們如果要使用版本為15.10的ubuntu系統鏡像來運行容器時,命令如下:
docker run -dit ubuntu:15.10 /bin/bash
參數說明:
-i: 交互式操作。
-t: 終端。
ubuntu:15.10: 這是指用 ubuntu 15.10 版本鏡像為基礎來啟動容器。
/bin/bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 /bin/bash。
如果你不指定一個鏡像的版本標簽,例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像。
獲取一個新的鏡像
當我們在本地主機上使用一個不存在的鏡像時 Docker 就會自動下載這個鏡像。如果我們想預先下載這個鏡像,我們可以使用 docker pull
命令來下載它。
docker pull kafka
下載完成后,我們可以直接使用這個鏡像來運行容器。
查找鏡像
我們可以從 Docker Hub 網站來搜索適合我們的鏡像.
docker search kafka
參數說明:
NAME: 鏡像倉庫源的名稱
DESCRIPTION: 鏡像的描述
OFFICIAL: 是否 docker 官方發布
stars: 類似 Github 里面的 star,表示點贊、喜歡的意思。
AUTOMATED: 自動構建。
下載完成后,我們就可以使用這個鏡像了
docker run -d kafka
創建鏡像
當我們從 docker 鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。
- 從已經創建的容器中更新鏡像,並且提交這個鏡像
- 使用 Dockerfile 指令來創建一個新的鏡像
- 載入鏡像
1. 從已經創建的容器中更新鏡像,並且提交這個鏡像
更新鏡像之前,我們需要使用鏡像來創建一個容器。
docker run -it kafka /bin/bash
在運行的容器內使用 apt-get update 命令進行更新。
退出這個容器:
exit
此時 ID 為 c2c789d2d3c5 的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit 來提交容器副本
docker commit -m="has update" -a="blue" c2c789d2d3c5 blue/kafka:v2
各個參數說明:
-m: 提交的描述信息
-a: 指定鏡像作者
c2c789d2d3c5:容器 ID
blue/kafka:v2: 指定要創建的目標鏡像名
我們可以使用 docker images 命令來查看我們的新鏡像 blue/kafka:v2
docker images
使用我們的新鏡像來啟動一個容器
docker run -dit blue/kafka:v2 /bin/bash
2. 使用 Dockerfile 指令來創建一個新的鏡像
我們使用命令 docker build , 從零開始來創建一個新的鏡像。
為此,我們需要創建一個 Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。
每一個指令都會在鏡像上創建一個新的層,每一個指令的前綴都必須是大寫的。
第一條FROM,指定使用哪個鏡像源
RUN 指令告訴docker 在鏡像內執行命令,安裝了什么。。。
然后,我們使用 Dockerfile 文件,通過 docker build 命令來構建一個鏡像
參數說明:
-t :指定要創建的目標鏡像名
. :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑
3. 載入鏡像
我們有了本地的鏡像文件,可將本地保存的鏡像再次導入docker中
docker load < xxx.tar 同 docker load --input xxx.tar 簡寫 docker load -i xxx.tar
設置鏡像標簽
我們可以使用 docker tag 命令,為鏡像添加一個新的標簽。
docker tag 860c279d2fec runoob/centos:dev
docker tag 鏡像ID,這里是 860c279d2fec ,用戶名稱、鏡像源名(repository name)和新的標簽名(tag)。
使用 docker images 命令可以看到,ID為860c279d2fec的鏡像多一個標簽。
保存鏡像
docker save -o xxx.tar xxx_tag
xxx.tar:保存到本地的鏡像名稱; xxx_tag: 鏡像名字
虛懸鏡像沒有用處,刪除
$ docker rmi $(docker images -q -f dangling=true)
Docker容器使用
docker ps
參數說明:
-a: 所有運行狀態的容器信息。
-q: 只顯示容器ID。
docker pull xxx
docker run -it xxx /bin/bash
參數說明:
-i: 交互式操作
-t: 終端
ubuntu: ubuntu 鏡像
/bin/bash 或 bash:放在鏡像名后的是命令,這里我們希望有個交互式 Shell
要退出終端,直接輸入:
exit
啟動已停止運行的容器
$ docker ps -a
$ docker start <容器 ID>
后台運行
在大部分的場景下,我們希望 docker 的服務是在后台運行的,我們可以過 -d 指定容器的運行模式。
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
參數說明:
- -i: 進入交互式操作
- -t: 終端
- -d: 后台運行 detach分離
- --name: 給容器起別名,你忘了,docker會隨機生成
- -p 無參數: 將容器內部使用的網絡端口隨機映射到我們使用的主機上
- -p 主機port:容器內部port 將容器內部使用的網絡端口映射到我們使用的主機網絡端口
給容器重命名
docker rename
stop停止一個容器
$ docker stop <容器 ID>
stop停止所有容器
$ docker stop $(docker ps -a -q)
停止的容器可以通過 docker restart 重啟:
$ docker restart <容器 ID>
進入容器
在使用 -d 參數時,容器啟動后會進入后台。此時想要進入容器,可以通過以下指令進入:
docker attach
docker exec:推薦大家使用 docker exec 命令,因為此退出容器終端,不會導致容器的停止。
exec 命令
docker exec -it 243c32535da7 /bin/bash
導出和導入容器
導出容器
如果要導出本地某個容器,可以使用 docker export 命令
$ docker export 1e560fca3906 > ubuntu.tar
這樣將導出容器快照到本地文件。
鏡像導入和容器導入的區別:
- 容器導入 是將當前容器 變成一個新的鏡像
- 鏡像導入 是復制的過程
刪除容器
刪除容器使用 docker rm 命令:
$ docker rm -f 1e560fca3906
清理掉所有處於終止狀態的容器。
$ docker container prune
remove刪除所有容器
$ docker rm $(docker ps -a -q)
示例
創建容器
docker run --privileged -itd -p 8888:22 --name centos7 9f38484d220f /usr/sbin/init
docker run -itd --name centos7.6 -p 8888:22 --privileged=true REPOSITORY_or_IMAGE_ID /usr/sbin/init
----privileged 啟動后讓docker容器具備超級特權。
-itd 交互式、終端、后台運行
-p 把宿主機的8888端口映射到docker的22端口。
宿主機就是運行docker的機器,這樣訪問宿主機IP:8888端口,實際訪問的是docker的22端口。
--name 給啟動的容器命名,方便后續操作
9f38484d220f 就是IMAGE ID
注意:--privileged 和/usr/sbin/init是必須的,否則會報錯。
我之前這里使用的是/bin/bash命令,docker中安裝完httpd服務后,
使用命令systemctl start httpd.service啟動ssh服務時會報錯:
Failed to get D-Bus connection: Operation not permitted
進入centos7.6鏡像, 並配置ssh服務
進入容器
docker exec -it centos7 /bin/bash
安裝openssh
yum install -y openssh-server openssh-clients
-
啟動openssh
systemctl start sshd
-
設置root密碼
passwd
-
退出容器
exit
-
登錄測試
退出后進入宿主機,通過下面命令ssh連接8888端口,實際就是docker的22端口。提示輸入密碼后,進入docker環境內部
運行一個web應用
我們將在docker容器中運行一個 Python Flask 應用來運行一個web應用。
docker pull training/webapp # 載入鏡像
docker run -d -P training/webapp python app.py
參數說明:
-
-d:讓容器在后台運行。
-
-P:將容器內部使用的網絡端口隨機映射到我們使用的主機上。
查看 WEB 應用容器
使用 docker ps 來查看我們正在運行的容器:
runoob@runoob:~# docker ps
CONTAINER ID IMAGE COMMAND ... PORTS
d3d5e39ed9d3 training/webapp "python app.py" ... 0.0.0.0:32769->5000/tcp
Docker 開放了 5000 端口(默認 Python Flask 端口)映射到主機端口 32769 上。
這時我們可以通過瀏覽器訪問WEB應用: 127.0.0.1:32769
我們也可以通過 -p 參數來設置不一樣的端口:
$ docker run -d -p 5000:5000 training/webapp python app.py
查看正在運行的容器: docker ps
runoob@runoob:~# docker ps
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
容器內部的 5000 端口映射到我們本地主機的 5000 端口上。
網絡端口的快捷方式
通過 docker ps 命令可以查看到容器的端口映射,
docker 還提供了另一個快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某個確定端口映射到宿主機的端口號。
查看WEB應用程序容器的進程
docker top 容器ID
檢查 WEB 應用程序
使用 docker inspect 來查看 Docker 的底層信息。
它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息。
docker inspect 容器ID
Docker容器啟動的時候,容器內部的目錄如果要掛載宿主機的一個目錄,可以用-v參數指定。
docker run -itd --rm --name username_container_version -p 5005:5005 -v /home/web/pro:/Project/pro image_name /bin/bash
冒號":"前面的目錄是宿主機目錄,后面的目錄是容器內目錄,在 Dockerfile 的 WORKDIR。
常用命令
列出所有的容器
docker ps -a
列出所有的容器IDs
docker ps -aq
列出所有的鏡像
docker images
列出所有的鏡像IDs
docker images -q
停止容器
docker stop CONTAINER-ID
先刪除引用鏡像的容器
docker rm CONTAINER-ID
再刪除這個鏡像
docker rmi -f IMAGE-ID
停止所有的容器
docker stop $(docker ps -aq)
刪除所有的容器
docker rm -f $(docker ps -aq)
刪除所有的鏡像
docker rmi -f $(docker images -q)
從Dockerfile文件的所在目錄, 構建鏡像
docker build -t django_myproject .
運行docker容器,--rm 停止容器后自動刪除容器
docker run -itd -p local-port:docker-container-internal-port --name 容器-REPOSITORY-name 鏡像-REPOSITORY-name:TAG
進入容器
docker exec -it docker-ID bash
退出容器
exit
查看docker日志
docker logs docker-ID