1反番、docker的基本概念
- 鏡像
- 容器
- 倉庫
2岳悟、docker安裝
卸載舊版本
舊版本的 Docker 稱為 docker
或者 docker-engine
漆际,使用以下命令卸載舊版本:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
使用 yum 安裝
- 更新yum源
$ cd /ect/yum.repos.d
$ mv CentOS-Base.repo CentOS-Base.repo.bak
$wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
$ yum update -y
PS:這里真是血的教訓(xùn),如果centos的yum源版本太低蛉签,要更新幔摸,否則你安裝的docker也會有問題
- 執(zhí)行以下命令安裝依賴包:
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 執(zhí)行下面的命令添加
yum
軟件源:
$ sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#$ sudo sed -i 's/download.docker.com/mirrors.ustc.edu.cn\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
安裝 Docker CE
方法1、更新 yum
軟件源緩存颤练,并安裝 docker-ce
既忆。
$ sudo yum makecache fast
$ sudo yum install docker-ce
方法2、使用腳本自動安裝
在測試或開發(fā)環(huán)境中 Docker 官方為了簡化安裝流程,提供了一套便捷的安裝腳本患雇,CentOS 系統(tǒng)上可以使用這套腳本安裝跃脊,另外可以通過 --mirror
選項(xiàng)使用國內(nèi)源進(jìn)行安裝:
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun
啟動 Docker CE
$ sudo systemctl enable docker
$ sudo systemctl start docker
其他指令
$ sudo systemctl status docker
$ sudo systemctl stop docker
可以使用 ps aux|grep docker
查看docker進(jìn)程
==PS:如果docker版本過低,可能會導(dǎo)致你后面再容器里面出現(xiàn)目錄無權(quán)限苛吱,真的是苦惱酪术。反正我試過17版本的docker是有問題的==
- 目前我的版本是
$ docker -v
Docker version 19.03.12, build 48a66213fe
建立 docker 用戶組
默認(rèn)情況下,docker
命令會使用 Unix socket 與 Docker 引擎通訊翠储。而只有 root
用戶和 docker
組的用戶才可以訪問 Docker 引擎的 Unix socket绘雁。出于安全考慮,一般 Linux 系統(tǒng)上不會直接使用 root
用戶援所。因此庐舟,更好地做法是將需要使用 docker
的用戶加入 docker
用戶組。
建立 docker
組:
$ sudo groupadd docker
將當(dāng)前用戶加入 docker
組:
$ sudo usermod -aG docker $USER
退出當(dāng)前終端并重新登錄住拭,進(jìn)行如下測試挪略。
- 測試 Docker 是否安裝正確
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
輸出以上內(nèi)容,說明docker
安裝完畢滔岳!
鏡像加速
國內(nèi)從 Docker Hub 拉取鏡像有時(shí)會遇到困難杠娱,此時(shí)可以配置鏡像加速器。國內(nèi)很多云服務(wù)商都提供了國內(nèi)加速器服務(wù)
- 修改鏡像源
對于使用 systemd 的系統(tǒng)谱煤,請?jiān)?/etc/docker/daemon.json
中寫入如下內(nèi)容(如果文件不存在請新建該文件)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
]
}
- 之后重新啟動服務(wù)摊求。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
- 檢查加速器是否生效
執(zhí)行 $ docker info
,如果從結(jié)果中看到了如下內(nèi)容趴俘,說明配置成功睹簇。
復(fù)制代碼Registry Mirrors: https://hub-mirror.c.163.com/
開啟 Docker CLI 的實(shí)驗(yàn)特性
- 編輯
~/.docker/config.json
文件驳规,新增如下條目
要用sudo命令
{
"experimental": "enabled"
}
- 開啟 Dockerd 的實(shí)驗(yàn)特性
編輯 /etc/docker/daemon.json
朗若,新增如下條目
{
"experimental": true
}
獲取鏡像、運(yùn)行容器
$ docker pull 用戶名/軟件名:版本
$ docker pull ubuntu:18.04
$ docker image ls #列出鏡像
$ docker run -it -rm ubuntu:18.04 bash #運(yùn)行容器
docker run
就是運(yùn)行容器的命令级遭,具體格式我們會在 容器 一節(jié)進(jìn)行詳細(xì)講解疲憋,我們這里簡要的說明一下上面用到的參數(shù)凿渊。
-
-it
:這是兩個(gè)參數(shù),一個(gè)是-i
:交互式操作缚柳,一個(gè)是-t
終端埃脏。我們這里打算進(jìn)入bash
執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端秋忙。 -
--rm
:這個(gè)參數(shù)是說容器退出后隨之將其刪除彩掐。默認(rèn)情況下,為了排障需求灰追,退出的容器并不會立即刪除堵幽,除非手動docker rm
狗超。我們這里只是隨便執(zhí)行個(gè)命令,看看結(jié)果朴下,不需要排障和保留結(jié)果努咐,因此使用--rm
可以避免浪費(fèi)空間。 -
ubuntu:18.04
:這是指用ubuntu:18.04
鏡像為基礎(chǔ)來啟動容器殴胧。 -
bash
:放在鏡像名后的是 命令渗稍,這里我們希望有個(gè)交互式 Shell,因此用的是bash
团滥。
進(jìn)入ubuntu容器后可以輸入命令cat /etc/os-release
查看當(dāng)前系統(tǒng)版本
查看鏡像竿屹、容器、數(shù)據(jù)卷所占用的空間
$ docker system df
#顯示如下
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 1 196.3MB 196.3MB (99%)
Containers 1 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
- 虛懸鏡像
$ docker image ls -f dangling=true
- 刪除虛懸鏡像
$ docker image prune
- 中間層鏡像查看(查看到的都是些鏡像的依賴)
$ docker image ls -a
- 獲取所有鏡像id
$ docker image ls -q
刪除本地鏡像
$ docker image rm [選項(xiàng)] <鏡像1> [<鏡像2> ...]
- 長id刪除鏡像
$ docker image rm 完整的id
- 短id刪除鏡像
$ docker image rm id的前三位數(shù)字
- 鏡像名刪除
$ docker image rm nginx:版本號
- 用 docker image ls 命令來配合刪除
$ docker image rm $(docker image ls -q redis)
其中
docker image ls -q redis 查出來是一個(gè)id號
3惫撰、docker 學(xué)習(xí)
利用commit 理解鏡像構(gòu)成
$ docker run --name webserver -d -p 80:80 nginx
- 這條命令會用
nginx
鏡像啟動一個(gè)容器羔沙,命名為webserver
,并且映射了 80 端口厨钻,這樣我們可以用瀏覽器去訪問這個(gè)nginx
服務(wù)器扼雏。
運(yùn)行之后可以訪問80端口,直接出現(xiàn)
- 現(xiàn)在夯膀,假設(shè)我們非常不喜歡這個(gè)歡迎頁面诗充,我們希望改成歡迎 Docker 的文字,我們可以使用
docker exec
命令進(jìn)入容器诱建,修改其內(nèi)容蝴蜓。
$ docker exec -it server bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
我們以交互式終端方式進(jìn)入 webserver
容器,并執(zhí)行了 bash
命令俺猿,也就是獲得一個(gè)可操作的 Shell茎匠。
然后,我們用 <h1>Hello, Docker!</h1>
覆蓋了 /usr/share/nginx/html/index.html
的內(nèi)容押袍。
現(xiàn)在我們再刷新瀏覽器的話诵冒,會發(fā)現(xiàn)內(nèi)容被改變了。
- 我們修改了容器的文件谊惭,也就是改動了容器的存儲層汽馋。我們可以通過
docker diff
命令看到具體的改動。
$ docker diff server
#顯示如下
C /run
A /run/nginx.pid
C /root
A /root/.bash_history
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf
現(xiàn)在我們定制好了變化圈盔,我們希望能將其保存下來形成鏡像豹芯。
要知道,當(dāng)我們運(yùn)行一個(gè)容器的時(shí)候(如果不使用卷的話)驱敲,我們做的任何文件修改都會被記錄于容器存儲層里铁蹈。而 Docker 提供了一個(gè) docker commit
命令,可以將容器的存儲層保存下來成為鏡像众眨。換句話說木缝,就是在原有鏡像的基礎(chǔ)上便锨,再疊加上容器的存儲層围辙,并構(gòu)成新的鏡像我碟。以后我們運(yùn)行這個(gè)新鏡像的時(shí)候,就會擁有原有容器最后的文件變化姚建。
- commit的語法為
$ docker commit --author "xue" --message "xue change the index.html today" server nginx:v2.6
其中 --author
是指定修改的作者矫俺,而 --message
則是記錄本次修改的內(nèi)容。這點(diǎn)和 git
版本控制相似掸冤,不過這里這些信息可以省略留空厘托。server是容器的名字,nginx是鏡像名稿湿,:后面的是Tag铅匹。我們可以在 docker image ls 中看到這個(gè)新定制的鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2.6 2c6cfdb01afb About a minute ago 132MB
ubuntu 18.04 8e4ce0a6ce69 3 days ago 64.2MB
nginx latest 2622e6cca7eb 10 days ago 132MB
hello-world latest bf756fb1ae65 5 months ago 13.3kB
- 使用 docker history
$ docker history nginx:v2.6
可以查看到我們提交的那一層
IMAGE CREATED CREATED BY SIZE COMMENT
2c6cfdb01afb 5 minutes ago nginx -g daemon off; 1.25kB xue change the index.html today
2622e6cca7eb 10 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
ps:慎用docker commit ,只是為了幫助理解鏡像的構(gòu)成和分層存儲的概念
使用Dockerfile定制鏡像
#在一個(gè)空目錄下新建文件夾
$ mkdir mynginx
$ cd mynginx
#新建Dockerfile文件
$ touch Dockerfile
Dockerfile文件內(nèi)容如下:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
- FROM 指定基礎(chǔ)鏡像
所謂定制鏡像饺藤,那一定是以一個(gè)鏡像為基礎(chǔ)包斑,在其上進(jìn)行定制。就像我們之前運(yùn)行了一個(gè) nginx
鏡像的容器涕俗,再進(jìn)行修改一樣罗丰,基礎(chǔ)鏡像是必須指定的。而 FROM
就是指定 基礎(chǔ)鏡像再姑,因此一個(gè) Dockerfile
中 FROM
是必備的指令萌抵,并且必須是第一條指令。
- RUN 執(zhí)行命令
RUN
指令是用來執(zhí)行命令行命令的元镀。由于命令行的強(qiáng)大能力绍填,RUN
指令在定制鏡像時(shí)是最常用的指令之一。其格式有兩種:
1栖疑、shell 格式:RUN <命令>
讨永,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN
指令就是這種格式蔽挠。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
2住闯、exec 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
,這更像是函數(shù)調(diào)用中的格式澳淑。
構(gòu)建鏡像
在 Dockerfile
文件所在目錄執(zhí)行:
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 2622e6cca7eb
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in fe12239024b7
Removing intermediate container fe12239024b7
---> 0b3563cb1ca1
Successfully built 0b3563cb1ca1
Successfully tagged nginx:v3
這里我們使用了 docker build
命令進(jìn)行鏡像構(gòu)建比原。其格式為:
$ docker build [選項(xiàng)] <上下文路徑/URL/->
ps: docker bulid -t nginx:v3 . 中的.是指上下文的意思
4、操作容器
啟動
啟動容器有兩種方式杠巡,一種是基于鏡像新建一個(gè)容器并啟動量窘,另外一個(gè)是將在終止?fàn)顟B(tài)(stopped
)的容器重新啟動。
- 啟動一個(gè)容器并且輸出“Hello World”之后終止容器
$ docker run ubuntu:18.04 echo 'Hello World'
- 啟動一個(gè) bash 終端氢拥,允許用戶進(jìn)行交互蚌铜。
$ docker run -it ubuntu:18.04 bash
#出現(xiàn)下面可以交互的偽終端
root@77049ca3ad59:/# pwd
/
其中锨侯,-t
選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上, -i
則讓容器的標(biāo)準(zhǔn)輸入保持打開冬殃。
使用docker container ls
查看當(dāng)前啟動的容器輸出如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77049ca3ad59 ubuntu:18.04 "bash" 4 minutes ago Up 4 minutes dreamy_grothendieck
當(dāng)利用 docker run
來創(chuàng)建容器時(shí)囚痴,Docker 在后臺運(yùn)行的標(biāo)準(zhǔn)操作包括:
- 檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
- 利用鏡像創(chuàng)建并啟動一個(gè)容器
- 分配一個(gè)文件系統(tǒng)审葬,并在只讀的鏡像層外面掛載一層可讀寫層
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去
- 從地址池配置一個(gè) ip 地址給容器
- 執(zhí)行用戶指定的應(yīng)用程序
- 執(zhí)行完畢后容器被終止
后臺運(yùn)行(守護(hù)態(tài)運(yùn)行)
更多的時(shí)候深滚,需要讓 Docker 在后臺運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時(shí)涣觉,可以通過添加 -d
參數(shù)來實(shí)現(xiàn)痴荐。
- 下面例子不加-d,執(zhí)行完直接輸出到宿主機(jī)上
$ docker run ubuntu:18.04 sh -c "while true; do echo hello world; sleep 1; done"
##
hello world
hello world
hello world
hello world
hello world
hello world
- 加上
-d
參數(shù)
$ docker run -d ubuntu:18.04 sh -c "while true; do echo hello world; sleep 1; done"
e8ff38cce9dc2ba4cb758502dd88fae480de248bb1c07be4ccc90507a19bfca0
使用 -d
參數(shù)啟動后會返回一個(gè)唯一的 id官册,也可以通過 docker container ls
命令來查看容器信息
要獲取容器的輸出信息生兆,可以通過 docker container logs
命令。
$ docker container logs [container ID or NAMES]
hello world
hello world
hello world
終止
可以使用 docker container stop
來終止一個(gè)運(yùn)行中的容器膝宁。
使用
ctrl+d
終止當(dāng)前容器使用exit退出當(dāng)前容器
終止?fàn)顟B(tài)的容器可以用 docker container ls -a
命令看到
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89490ea8d4d3 ubuntu:18.04 "bash" 5 minutes ago Exited (130) 5 minutes ago kind_banzai
e8ff38cce9dc ubuntu:18.04 "sh -c 'while true; …" 11 minutes ago Exited (0) About a minute ago affectionate_shannon
a7fb459a33b9 ubuntu:18.04 "bash" 11 minutes ago Exited (127) 5 minutes ago beautiful_dewdney
beda02a77088 ubuntu:18.04 "sh -c 'while true; …" 15 minutes ago Exited (0) 15 minutes ago awesome_goldberg
aa03830b0b3f ubuntu:18.04 "sh -c 'echo 1;'" 16 minutes ago Exited (0) 16 minutes ago
拿到了 CONTAINER ID 后可以使用docker container start -a CONTAINER ID
啟動已經(jīng)關(guān)閉的容器
docker container restart
命令會將一個(gè)運(yùn)行態(tài)的容器終止鸦难,然后再重新啟動它
進(jìn)入容器
啟動容器之后,如果想要進(jìn)入容器執(zhí)行命令昆汹。推薦使用docker exec
$ docker exec -it containerID bash
#執(zhí)行此命令會有偽終端的命令提示符
導(dǎo)出/導(dǎo)出容器
- 導(dǎo)出容器
$ docker container ls
##
#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98f83fc01249 ubuntu:18.04 "/bin/bash" 15 minutes ago Up 15 minutes amazing_germain
##
$ docker export 98f83fc01249 > unbuntu0630.tar
- 導(dǎo)入容器快照
是將容器快照導(dǎo)入為鏡像
$ cat unbuntu0630.tar | docker import - test/ubuntu:0630
*注:用戶既可以使用 docker load 來導(dǎo)入鏡像存儲文件到本地鏡像庫明刷,也可以使用 docker import 來導(dǎo)入一個(gè)容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài))满粗,而鏡像存儲文件將保存完整記錄辈末,體積也要大。此外映皆,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息挤聘。*
刪除容器
可以使用 docker container rm
來刪除一個(gè)處于終止?fàn)顟B(tài)的容器。例如
$ docker container rm 容器id
如果要刪除一個(gè)運(yùn)行中的容器捅彻,可以添加 -f
參數(shù)组去。Docker 會發(fā)送 SIGKILL
信號給容器。
- 清理所有處于終止?fàn)顟B(tài)的容器
用 docker container ls -a
命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器步淹,如果數(shù)量太多要一個(gè)個(gè)刪除可能會很麻煩从隆,用下面的命令可以清理掉所有處于終止?fàn)顟B(tài)的容器。
$ docker container prune
5缭裆、docker倉庫
Docker Hub操作
Docker Hub官方: https://hub.docker.com
1键闺、登錄/退出
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: 賬號
Password:
WARNING! Your password will be stored unencrypted in /home/xue/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#登錄成功
$ docker logout
Removing login credentials for https://index.docker.io/v1/
#退出登錄
2、查找鏡像
$ docker search 鏡像名
3澈驼、拉取鏡像
$ docker pull 用戶名/軟件名:版本
4辛燥、推送鏡像
用戶也可以在登錄后通過 docker push
命令來將自己的鏡像推送到 Docker Hub。
以下命令中的 username
請?zhí)鎿Q為你的 Docker 賬號用戶名。
$ docker tag ubuntu:18.04 username/ubuntu:18.04
私有倉庫
docker-registry
是官方提供的工具挎塌,可以用于構(gòu)建私有的鏡像倉庫徘六。本文內(nèi)容基于 docker-registry
v2.x 版本。
1榴都、安裝運(yùn)行docker-registry
這將使用官方的 registry
鏡像來啟動私有倉庫待锈。默認(rèn)情況下,倉庫會被創(chuàng)建在容器的 /var/lib/registry
目錄下缭贡。你可以通過 -v
參數(shù)來將鏡像文件存放在本地的指定路徑炉擅。例如下面的例子將上傳的鏡像放到本地的 /opt/data/registry
目錄。
$ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
--restart=always --name registry
registry
186bded94f4e00177428231596f285c4f437f08059a8263adea4aa237babbd75
#--restart=always --name registry 一定要有這一句阳惹,不然倉庫要創(chuàng)建完后在手動開啟。如果忘記開啟就會導(dǎo)致推送不成功--|| 我就是這樣
-d
指在后臺運(yùn)行眶俩;-v
指定私有倉庫路徑莹汤;-p
指定映射端口--restart=always
:倉庫要保持開啟狀態(tài)
注:-p 這里:左邊是映射到主機(jī)端口 右邊是默認(rèn)端口
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
186bded94f4e registry "/entrypoint.sh /etc…" 22 seconds ago Up 19 seconds 0.0.0.0:5000->5000/tcp registry
確認(rèn)容器已開啟!
2颠印、在私有倉庫上傳纲岭、搜索、下載鏡像
-
使用
docker tag
標(biāo)記要上傳到私有倉庫的鏡像使用
docker tag
將ubuntu:18.04
這個(gè)鏡像標(biāo)記為10.10.10.42/ubuntu:18.04
线罕。格式為
docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]
止潮。
$ docker image ls
$ docker tag ubuntu:18.04 10.10.10.42/ubuntu:18.04
- 使用
docker push
上傳鏡像到本地倉庫
$ docker push 10.10.10.42:5000/ubuntu:18.04
The push refers to repository [10.10.10.42:5000/ubuntu]
ddc500d84994: Pushed
c64c52ea2c16: Pushed
5930c9e5703f: Pushed
b187ff70b2e4: Pushed
18.04: digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10 size: 1152
- 用
curl
查看倉庫中的鏡像。
$ curl 127.0.0.1:5000/v2/_catalog
{"repositories":["ubuntu"]}
3钞楼、注意事項(xiàng)
如果你不想使用 127.0.0.1:5000
作為倉庫地址喇闸,比如想讓本網(wǎng)段的其他主機(jī)也能把鏡像推送到私有倉庫。你就得把例如 10.10.10.42:5000
這樣的內(nèi)網(wǎng)地址作為私有倉庫地址询件,這時(shí)你會發(fā)現(xiàn)無法成功推送鏡像燃乍。
這是因?yàn)?Docker 默認(rèn)不允許非 HTTPS
方式推送鏡像。我們可以通過 Docker 的配置選項(xiàng)來取消這個(gè)限制宛琅,或者查看下一節(jié)配置能夠通過 HTTPS
訪問的私有倉庫刻蟹。
- Ubuntu 16.04+, Debian 8+, centos 7
對于使用 systemd
的系統(tǒng),請?jiān)?/etc/docker/daemon.json
中寫入如下內(nèi)容(如果文件不存在請新建該文件)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com"
],
"experimental":true,
"insecure-registries":[
"10.10.10.42:5000"
]
}
注意:該文件必須符合
json
規(guī)范嘿辟,否則 Docker 將不能啟動舆瘪。
systemctl restart docker
重啟!
Nexus3.x私有倉庫
使用 Docker 官方的 Registry 創(chuàng)建的倉庫面臨一些維護(hù)問題红伦。比如某些鏡像刪除以后空間默認(rèn)是不會回收的英古,需要一些命令去回收空間然后重啟 Registry 程序。在企業(yè)中把內(nèi)部的一些工具包放入 Nexus 中是比較常見的做法色建,最新版本 Nexus3.x
全面支持 Docker 的私有鏡像哺呜。所以使用 Nexus3.x
一個(gè)軟件來管理 Docker
, Maven
, Yum
, PyPI
等是一個(gè)明智的選擇。
1、啟動Nexus 容器
$ docker run -d --name nexus3 --restart=always \
-p 8081:8081 \
-p 8899:8899 \
--mount src=nexus-data,target=/nexus-data \
sonatype/nexus3
Unable to find image 'sonatype/nexus3:latest' locally
latest: Pulling from sonatype/nexus3
78afc5364ad2: Pull complete
58e1deb9693d: Pull complete
77b60dc98dd9: Pull complete
1646c0c7a5bf: Pull complete
Digest: sha256:3262783b5f44c6265cf867b390e84a643b855873b2018c0d28037d7cd29a89cf
Status: Downloaded newer image for sonatype/nexus3:latest
a987923a16182c879931fc498a5ca002a22181dfc627337e9d474f52184eb8c7
成功某残!
注:這里的 8801 是Nexus啟動的默認(rèn)端口国撵,8899端口是登錄Nexus后新建倉庫給倉庫配置的端口。如果沒有再開啟8899這個(gè)端口玻墅,將不能登錄到Nexus的倉庫中進(jìn)行上傳和下載鏡像的介牙。
等待 3-5 分鐘,如果 nexus3
容器沒有異常退出澳厢,那么你可以使用瀏覽器打開 http://YourIP:8081
訪問 Nexus 了环础。
第一次啟動 Nexus 的默認(rèn)帳號是 admin
密碼是 admin123
登錄以后點(diǎn)擊頁面上方的齒輪按鈕進(jìn)行設(shè)置。
2 剩拢、查看Nexus默認(rèn)密碼
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a987923a1618 sonatype/nexus3 "sh -c ${SONATYPE_DI…" 12 minutes ago Up 12 minutes 0.0.0.0:8081->8081/tcp nexus3
186bded94f4e registry "/entrypoint.sh /etc…" 3 hours ago Up 3 hours 0.0.0.0:5000->5000/tcp registry
找到Nexus的ID线得,開啟終端進(jìn)入容器
$ docker exec -it a987923a1618 bash
bash-4.4$ cat /nexus-data/admin.password
ddef4fcf-26a2-4917-b230-b7c1f21a6899
bash-4.4$
3、創(chuàng)建倉庫
創(chuàng)建一個(gè)私有倉庫的方法: Repository->Repositories
點(diǎn)擊右邊菜單 Create repository
選擇 docker (hosted)
- Name: 倉庫的名稱
- HTTP: 倉庫單獨(dú)的訪問端口
- Enable Docker V1 API: 如果需要同時(shí)支持 V1 版本請勾選此項(xiàng)(不建議勾選)徐伐。
- Hosted -> Deployment pollcy: 請選擇 Allow redeploy 否則無法上傳 Docker 鏡像贯钩。
其它的倉庫創(chuàng)建方法請各位自己摸索,還可以創(chuàng)建一個(gè) docker (proxy) 類型的倉庫鏈接到 DockerHub 上办素。再創(chuàng)建一個(gè) docker (group) 類型的倉庫把剛才的 hosted 與 proxy 添加在一起角雷。主機(jī)在訪問的時(shí)候默認(rèn)下載私有倉庫中的鏡像,如果沒有將鏈接到 DockerHub 中下載并緩存到 Nexus 中性穿。
4勺三、連接倉庫
$ docker login 10.10.10.42:8899
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/xue/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
成功!
- 標(biāo)記鏡像
$ docker tag ubuntu:18.04 10.10.10.42:8899/ubuntu:18.04
- 推送鏡像
$ docker push 10.10.10.42:8899/ubuntu:18.04
The push refers to repository [10.10.10.42:8899/ubuntu]
ddc500d84994: Pushed
c64c52ea2c16: Pushed
5930c9e5703f: Pushed
b187ff70b2e4: Pushed
18.04: digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10 size: 1152
- 獲取Nexus上的鏡像
#刪除本地鏡像
$ docker image rm 10.10.10.42:8899/ubuntu
#再拉取
$ docker pull 10.10.10.42:8899/ubuntu:18.04
18.04: Pulling from ubuntu
Digest: sha256:c32bd2e76e7688eeb1bb39754fff7cdfc571626fc1abfded4f82a90de79f8d10
Status: Downloaded newer image for 10.10.10.42:8899/ubuntu:18.04
10.10.10.42:8899/ubuntu:18.04
6需曾、Docker Compose
tips:arch查看主機(jī)系統(tǒng)架構(gòu)
安裝與卸載
#使用pip安裝
#安裝python-pip
$ yum -y install epel-release
$ yum -y install python-pip
$ pip install --upgrade pip
$ sudo pip install -U docker-compose
安裝成功后使用命令查看版本號
$ docker-compose -v
docker-compose version 1.26.2, build unknown
#安裝成功吗坚!
卸載
如果是二進(jìn)制包方式安裝的,刪除二進(jìn)制文件即可胯舷。
$ sudo pip uninstall docker-compose
不推薦二進(jìn)制包下載刻蚯,是在太坑了,下了半天沒成功過一次桑嘶!
使用docker-compose .yml
首先介紹幾個(gè)術(shù)語炊汹。
- 服務(wù) (
service
):一個(gè)應(yīng)用容器,實(shí)際上可以運(yùn)行多個(gè)相同鏡像的實(shí)例逃顶。 - 項(xiàng)目 (
project
):由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元讨便。
可見,一個(gè)項(xiàng)目可以由多個(gè)服務(wù)(容器)關(guān)聯(lián)而成以政,Compose
面向項(xiàng)目進(jìn)行管理霸褒。
場景
最常見的項(xiàng)目是 web 網(wǎng)站,該項(xiàng)目應(yīng)該包含 web 應(yīng)用和緩存盈蛮。
下面我們用 Python
來建立一個(gè)能夠記錄頁面訪問次數(shù)的 web 網(wǎng)站废菱。
web 應(yīng)用
在一個(gè)空目錄下新建文件夾,在該目錄中編寫 app.py
文件
from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 該頁面已被訪問 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
Dockerfile
編寫 Dockerfile
文件殊轴,內(nèi)容為
FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]
docker-compose.yml
編寫 docker-compose.yml
文件衰倦,這個(gè)是 Compose 使用的主模板文件。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpiney
運(yùn)行 docker-compose 項(xiàng)目
$ docker-compose up
此時(shí)訪問本地 5000
端口旁理,每次刷新頁面樊零,計(jì)數(shù)就會加 1。
運(yùn)行容器之后孽文,如果想進(jìn)入容器使用以下命令
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74e22b7ad8b0 web_web "python app.py" 24 hours ago Up 36 seconds 0.0.0.0:5000->5000/tcp web_web_1
09ddb170b068 redis:alpine "docker-entrypoint.s…" 24 hours ago Up 35 seconds 6379/tcp web_redis_1
#拿到容器id74e22b7ad8b0
$ docker exec -it 74e22b7ad8b0 sh
/code # pwd
/code
/code #
compose 模板文件
模板文件是使用 Compose
的核心驻襟,涉及到的指令關(guān)鍵字也比較多。但這里面大部分指令跟 docker run
相關(guān)參數(shù)的含義都是類似的芋哭。
默認(rèn)的模板文件名稱為 docker-compose.yml
沉衣,格式為 YAML 格式。
docker run -v /www/hyperf:/hyperf-skeleton --name hyperf_test -p 9501:9501 -it --entrypoint /bin/sh hyperf/hyperf:7.2-alpine-v3.9-cli
作者@發(fā)胖的向日葵