centos7: https://docs.docker.com/install/linux/docker-ce/centos/
Docker的安裝使用
1, 卸載舊版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2, 先安裝依賴
我在安裝的時(shí)候,第一次報(bào)錯(cuò),重新執(zhí)行了一次正常了
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
3, 設(shè)置安裝倉(cāng)庫(kù)
我這里報(bào)錯(cuò)
# 執(zhí)行前先把yum更新到最新,要不然可能會(huì)報(bào)錯(cuò)啥到
$ sudo yum update
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4, 安裝docker
$ sudo yum install docker-ce
# 如果需要指定安裝版本,使用如下命令
$ sudo yum install docker-ce-<VERSION STRING>
5,啟動(dòng)docker
sudo systemctl start docker
6, 啟動(dòng)hello-world鏡像檢查是否安裝正常
sudo docker run hello-world
7, 設(shè)置阿里云鏡像加速
- 您可以通過(guò)修改daemon配置文件/etc/docker/daemon.json來(lái)使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://08jkonzq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Dcoker的基本命令
1,幫助命令
docker version
docker info
docker --help
2, 鏡像信息查看
$> docker images
# 列出本地所有鏡像的詳細(xì)信息(含中間映像層)
$> docker images -a
# 查詢當(dāng)前鏡像的id值
$> docker images -q
# 查詢當(dāng)前所有鏡像的id
$> docker images -qa
# 顯示鏡像的摘要信息
$> docker images --digests
3,鏡像操作
# 具體參考2
$> docker images
$> docker search tomcat
# 查找star大于100的
$> docker search tomcat -s 100
# 下載鏡像
$> docker pull tomcat
# 刪除指定鏡像,空格隔開(kāi)可以刪除多個(gè)
$> docker rmi hello-world
# 強(qiáng)制刪除
$> docker rmi -f hello-world
# 刪除所有的
$> docker rmi -f $(docker images -qa)
4,容器命令01
# 我們這里通過(guò)centos鏡像創(chuàng)建一個(gè)centos容器然后演示docker的容器命令
$> docker pull centos
# 啟動(dòng)并創(chuàng)建容器, i代表interactive, t代表terminal
$> docker run -it 1e1148e4cc2c
$> docker run -it --name centos01 1e1148e4cc2c
$> docker run -it centos # 后面也可以直接跟名字就可以
# 列出所有正在運(yùn)行的docker容器,這個(gè)是在宿主機(jī)上運(yùn)行哈
$> docker ps
$> docker ps -a # 顯示所有的,包括正在運(yùn)行的和歷史運(yùn)行的
$> docker ps -l # 顯示最近創(chuàng)建的容器
$> docker ps -n 3 # 顯示最近創(chuàng)建的3個(gè)容器
$> docker ps -q # 靜默模式,只顯示當(dāng)前正在運(yùn)行的容器編號(hào)
$> docker ps --no-trunc # 不截?cái)噍敵?,顯示信息的全部
# 從容器中退出,這個(gè)是在容器中運(yùn)行哈
# exit是代表容器關(guān)閉,然后退出,ctrl代表容器不關(guān)閉,然后退出界面
$> exit
$> ctrl + P + Q
# 刪除容器, 注意:只能刪除已經(jīng)停止的容器
$> docker rm 8dad94645d45
$> docker rm $(docker ps -qa)
$> docker rm -f $(docker ps -qa)
# 退出的容器重新啟動(dòng)
$> docker start 5455e2a3e728
# 重啟容器
$> docker restart 5455e2a3e728
# 停止容器
$> docker stop 5455e2a3e728
# 強(qiáng)制停止容器
$> docker kill 5455e2a3e728
5, 容器命令02
# 守護(hù)進(jìn)程式啟動(dòng), 這個(gè)基本啟動(dòng)之后就會(huì)退出
$> docker run -d centos
# 守護(hù)線程, 并一直循環(huán)打印log,啟動(dòng)后ID是251fd9453a78
$> docker run -d centos /bin/sh -c "while true; do echo hello; sleep 2; done"
# 查看上面啟動(dòng)的那個(gè)守護(hù)線程的log
$> docker logs 251fd9453a78
$> docker logs -t 251fd9453a78 # 這個(gè)可以顯示日志打印的時(shí)間
$> docker logs -t -f 251fd9453a78 # 顯示時(shí)間并追加
$> docker logs -t -f -tail 10 251fd9453a78 # 從最后10行開(kāi)始
# 查看top, 進(jìn)程
$> docker top 251fd9453a78
# 查看docker內(nèi)部細(xì)節(jié)
$> docker inspect 251fd9453a78
# 重新進(jìn)入退出未關(guān)閉的容器01
$> docker attach f9e146bc4fd
# 重新進(jìn)入退出未關(guān)閉的容器02,這里試了一下好像可以進(jìn)入,但是無(wú)法執(zhí)行內(nèi)部命令,后面再看看#是因?yàn)橹皼](méi)有加i,不能交互
$> docker exec -it f9e146bc4fd8 /bin/bash
# exec還有一個(gè)功能就是可以在不進(jìn)入內(nèi)部的時(shí)候執(zhí)行容器命令
$> docker exec -t f9e146bc4fd8 ls /
# 容器內(nèi)數(shù)據(jù)拷貝到主機(jī)
$> docker cp f9e146bc4fd8:/tmp/yum.log /root/
6, 鏡像commit
# 運(yùn)行tomcat并制定端口號(hào), -p制定端口號(hào), -P是隨機(jī)分配端口
$> docker run -it -p 8080:8080 tomcat
$> docker run -it -P tomcat
# 進(jìn)入到tomcat根目錄下并刪除掉文檔目錄
$> docker exec -it 35dc9c72f95f /bin/bash
# 提交沒(méi)有文檔的這個(gè)容器, a:author, m:message
$> rm -rf webapps/docs/
$> docker commit -a 'ivanl001' -m 'without docs' 35dc9c72f95f tomcat_without_docs:1.0
# 先刪除當(dāng)前運(yùn)行的所有容器
$> docker rm -f $(docker ps -q)
# 運(yùn)行剛才提交的那個(gè)image,注意:需要帶版本號(hào), 這個(gè)啟動(dòng)的容器中就沒(méi)有文檔
$> docker run -it -p 8080:8080 tomcat_without_docs:1.0
# tomcat也可以后臺(tái)守護(hù)進(jìn)程運(yùn)行
$> docker run -d -p 8888:8080 tomcat_without_docs:1.0
7, Docker容器數(shù)據(jù)卷
7.1, 容器卷用-v, --volume list
# 啟動(dòng)容器,并把容器中的data目錄和宿主機(jī)中的/data/docker/centos文件共享,雙向同步哈
$> docker run -it -v /data/docker/centos:/data centos
# 通過(guò)如下方式進(jìn)行查看具體的配置json格式
$> docker inspect c87d8c174f49
# read only:ro, 只讀, 在容器中共享目錄下文件是只讀的,不能修改
$> docker run -it -v /data/docker/centos:/data:ro centos
# 通過(guò)如下方式進(jìn)行查看具體的配置json格式
$> docker inspect c87d8c174f49
7.2, 容器卷用dockerfile
- 創(chuàng)建Dockerfile,內(nèi)容如下:
# volume test
FROM centos
VOLUME ["/data1", "data2"]
CMD echo "finished, success----------------"
CMD /bin/bash
-
使用Dockerfile構(gòu)建鏡像
docker build -f /data/docker/dockerfile/Dockerfile -t dockerfile_image .
查看鏡像發(fā)現(xiàn)已經(jīng)存在dockerfile_image
docker images
-
運(yùn)行鏡像, 可以在其根目錄下發(fā)現(xiàn)自動(dòng)生成了兩個(gè)文件夾data1,data2
docker run -it dockerfile_image
-
這次雖然我們沒(méi)有通過(guò)-v進(jìn)行鏡像指定,但是docker默認(rèn)也會(huì)進(jìn)行一個(gè)默認(rèn)的指定位置,通過(guò)inspect命令可以發(fā)現(xiàn)如下內(nèi)容:data1指定給/var/lib/docker/volumes/30a6c5496d2aa7b095c14d0df685fe6b7d71914a08900c5deb681f1d8bf05c67/_data
"Mounts": [ { "Type": "volume", "Name": "30a6c5496d2aa7b095c14d0df685fe6b7d71914a08900c5deb681f1d8bf05c67", "Source": "/var/lib/docker/volumes/30a6c5496d2aa7b095c14d0df685fe6b7d71914a08900c5deb681f1d8bf05c67/_data", "Destination": "/data1", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "f0b31077bf25aa9b92142d3c688a1994732e5977c74e3c67095a107a30a75825", "Source": "/var/lib/docker/volumes/f0b31077bf25aa9b92142d3c688a1994732e5977c74e3c67095a107a30a75825/_data", "Destination": "data2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ]
數(shù)據(jù)卷容器
1, 父容器c00
- 先創(chuàng)建父容器
docker run -it --name c00 dockerfile_image
2, 子容器c10
- 然后從父容器創(chuàng)建子容器, 這樣, c00 和 c10 的data1和data2就是共享的,雙向的
docker run -it --name c10 --volumes-from c00 dockerfile_image
3, 子容器c20
- 同2一樣,再創(chuàng)建c00的子容器c20, 這樣,三個(gè)容器的data1和data2都是共享的
docker run -it --name c20 --volumes-from c00 dockerfile_image
4, 關(guān)閉c00
- 如何關(guān)掉父容器,其余兩個(gè)容器的共享功能并不會(huì)被影響
docker kill bdd11378491d
Dockerfile語(yǔ)法
Dockerfile是軟件的原材料
Docker鏡像是軟件的交付品
Docker容器是軟件的運(yùn)行態(tài)
1, dockerfile的保留字
FROM 基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的
MAINTAINER 鏡像作者
RUN 容器構(gòu)建時(shí)候需要運(yùn)行的命令
EXPOSE 容器暴露的端口號(hào)
WORKDIR 指定在創(chuàng)建容器后, 終端默認(rèn)登錄進(jìn)來(lái)的工作目錄,比如centos的/目錄
ENV 用來(lái)在構(gòu)建鏡像過(guò)程中設(shè)置環(huán)境變量
ADD 將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像且ADD命令或自動(dòng)處理uRL和解壓tar壓縮包
COPY 將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像
COPY src dest
COPY ['src', 'dest']
VOLUME 容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
CMD 指定一個(gè)容器啟動(dòng)時(shí)候所需要執(zhí)行的命令
Dockerfile中可以有多個(gè)CMD命令,但是只有最后一個(gè)會(huì)生效,CMD會(huì)被docker run之后的參數(shù)替換
ENTRYPOINT 指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令
ENTRYPOINT的目的和CMD一樣, 都是在指定容器啟動(dòng)程序及參數(shù)
ONBUILD
| build | both | run |
|---|---|---|
| FROM | WORKDIR | CMD |
| MAINTAINER | USER | ENV |
| COPY | EXPOSE | |
| ADD | VOLUME | |
| RUN | ENTRYPOINT | |
| ONBUILD | ||
| .dockerignore |
2, Dockerfile自定義鏡像
centos
更改登錄后默認(rèn)目錄是/data
登錄后默認(rèn)會(huì)支持vim和ifconfig命令
from centos
ENV mypath /data
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD /bin/bash
2.1, 構(gòu)建鏡像
- 使用如上的鏡像dockerfile構(gòu)建成鏡像, -t是tag,target string,最后一個(gè)點(diǎn)不太清楚作用
docker build -f /data/docker/dockerfile/dockerfile01 -t cus_centos:1.0.0 .
2.2, 運(yùn)行容器
- 進(jìn)入之后檢查一下, 默認(rèn)目錄是不是/data, 并且可以執(zhí)行vim和ifconfig命令
docker build -f /data/docker/dockerfile/dockerfile01 -t cus_centos:1.0.0 .
2.3, 查看鏡像歷史
docker history a35c41a18525
3, CMD和ENTRYPOINT
3.1, CMD
-
CMD會(huì)被覆蓋,如下命令, 因?yàn)?ls /覆蓋了dockerfile中的CMD ["catalina.sh", "run"], 所以最后并不會(huì)啟動(dòng)tomcat,只會(huì)打印出ls的結(jié)果
docker run -it tomcat ls /
3.2, ENTRYPOINT(先不練習(xí)了)
-
ENTRYPOINT不會(huì)被覆蓋,后面的ENTRYPOINT命令只會(huì)以追加的方式執(zhí)行