docker(一)--基礎(chǔ)命令
什么是容器
一種虛擬化的方案
操作系統(tǒng)級別的虛擬化
只能運(yùn)行相同或相似內(nèi)核的操作系統(tǒng)
依賴于linux內(nèi)核特性:namespace和cgroups(control group)
linux namespaces 命名空間
通過namespaces將以下資源隔離:
uts(unix timesharing system)主機(jī)名和域名 ipc(inter-process communication)信號量、消息隊(duì)列和共享內(nèi)存 跨進(jìn)程通信的訪問 pid(processid) 進(jìn)程編號 net(network) 管理網(wǎng)絡(luò)接口,網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)棧、端口等 mnt(mount) 管理掛載點(diǎn)(文件系統(tǒng)) user 用戶和用戶組
control groups(cgroups)控制組 用戶空間的資源分配
blkio:塊設(shè)備io
cpu:cpu
cpuacct:cpu資源使用報(bào)告
cpuset:多處理器平臺上的cpu集合
devices: 設(shè)備訪問
freezer:掛起或恢復(fù)任務(wù)
memeory:內(nèi)存用量及報(bào)告
perf_event:對cgroup中的任務(wù)進(jìn)行統(tǒng)一性能測
net_cls:cgroup中的任務(wù)創(chuàng)建的數(shù)據(jù)報(bào)文的類別

鏡像:靜態(tài)
容器:動態(tài)的,有生命周期
安裝docker
依賴環(huán)境:
- 64bits cpu
- linux kernel 3.10+
- linux kernel cgroups and namespaces
最好是安裝在centos7,因?yàn)閥um的倉庫docker版本比較老,直接使用清華大學(xué)的鏡像
配置yum源:
# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
修改
# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
安裝
# yum install docker-ce
docker配置文件
mkdir /etc/docker #默認(rèn)不存在,需要自己創(chuàng)建
vim /etc/docker/daemon.json
定義鏡像加速器:
可以使用docker cn/阿里云加速器/中國科技大學(xué)加速器
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
Daemon:
# systemctl start docker
# docker version #查看docker client和server 的version信息
# docker --help
docker 對象有images,containers,networks,volumes,plugin等對象,都可以執(zhí)行增刪改查操作。
# docker container --help
# docker info #查看docker詳細(xì)信息
鏡像
# docker search nginx
alpine:(微型發(fā)行版,小鏡像,提供基礎(chǔ)環(huán)境,不帶調(diào)試工具,不建議用在生產(chǎn)環(huán)境)
# docker [image] pull
# docker inspect 1e1148e4cc2c #查看鏡像的詳細(xì)信息
容器
docker container ls # 列出正在運(yùn)行的容器
docker container ls -a # 列出所有容器,包括停止運(yùn)行的
docker ps 等同于docker container ls
docker [container] run
docker container stop 9a34a9f0e7d2
docker container rm 9a34a9f0e7d2
運(yùn)行容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
-t (tty) 讓docker分配一個(gè)偽終端
- -i 交互式訪問
- --name 容器名稱
- --network 容器網(wǎng)絡(luò),默認(rèn)bridge。 通過docker network ls 可以查看到
- -d 運(yùn)行在后臺
運(yùn)行一個(gè)容器:
# docker run -d --name web1 nginx:1.14-alpine
# docker run --name b1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # httpd --help
/ # mkdir /data/html -p
/ # vi /data/html/index.html
/ # httpd -f -h /data/html/ 運(yùn)行httpd
在容器外部可以訪問該httpd服務(wù),打開另一個(gè)終端:
# docker inspect b1 查看容器信息,容器ip
# curl 172.17.0.2
docker ps -a (docker container ls -a) 查看所有容器
啟動已停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
Start one or more stopped containers
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
# docker start -a -i b1 重新啟動b1容器
停止容器
docker stop
docker kill
刪除容器
docker rm b1
進(jìn)入一個(gè)后臺啟動的容器中:
docker attach container_name/container_id
在容器中執(zhí)行命令
docker container exec -it web1 /bin/sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 nginx: master process nginx -g daemon off;
6 nginx 0:00 nginx: worker process
17 root 0:00 /bin/sh
23 root 0:00 ps
查看容器日志
# docker container logs 63e704e720fa

Docker Images
docker鏡像中含有啟動容器所需要的文件系統(tǒng)及其內(nèi)容,因此,其用于創(chuàng)建并啟動容器。
- 采用分層構(gòu)建機(jī)制,最底層為bootfs,上面是rootfs
- bootfs: 用于系統(tǒng)引導(dǎo)的文件系統(tǒng),包括bootloader和kernel,容器啟動完成后會被卸載以節(jié)約內(nèi)存資源
- rootfs:位于bootfs之上,表現(xiàn)為docker容器的根文件系統(tǒng);
傳統(tǒng)模式中,系統(tǒng)啟動時(shí),內(nèi)核掛載rootfs時(shí)會首先將其掛載為只讀模式,完整性自檢完成后將其重新掛載為讀寫模式
docker中,rootfs由內(nèi)核掛載為“只讀”模式,而后通過聯(lián)合“掛載技術(shù)”額外掛載一個(gè)“讀寫層”。

dockers image layer
- 位于下層的鏡像為父鏡像(parent image),最底層的為基礎(chǔ)鏡像
- 最上層為“可讀寫”層,其下的均為“只讀”層,如果容器被刪除,最上層的讀寫層會一并被刪除
docker 分層鏡像
docker分層鏡像,除了aufs,還支持btrfs,devicemapper,overlay2和vfs等
Docker Registry
啟動容器時(shí),docker daemon 會試圖從本地獲取相關(guān)鏡像,本地鏡像不存在時(shí),會從Registry中下載鏡像并保存到本地。
Registry用于保存docker鏡像,包括鏡像的層次結(jié)構(gòu)和元數(shù)據(jù)
分類:
- Sponsor Registry:第三方的registry,供客戶和docker社區(qū)使用
- Mirror Registry:第三方的registry,只讓客戶使用
- Vendor Registry:由發(fā)布docker鏡像的供應(yīng)商提供的registry
- Private Registry:通過設(shè)有防火墻和額外的安全層的私有實(shí)體提供的registry
Registry(repository and index)
Repository
- 由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫
- 一個(gè)Registry可以存在多個(gè)Repository
- Repository可分為“頂層倉庫”和“用戶倉庫”
- 用戶倉庫名稱格式為“用戶名/倉庫名”
- 每個(gè)倉庫可以包含多個(gè)Tag(標(biāo)簽),每個(gè)標(biāo)簽對應(yīng)一個(gè)鏡像。一個(gè)鏡像可以有多個(gè)tag,一個(gè)tag只能屬于一個(gè)鏡像
Index
- 維護(hù)用戶賬戶、鏡像的校驗(yàn)以及公共命名空間的信息
- 相當(dāng)于為registry提供了一個(gè)完成用戶認(rèn)證等功能的檢索接口
docker registry中的鏡像通常由開發(fā)人員制作,而后推送至“公共”或“私有”registry上保存,公其它人員使用,例如部署到生產(chǎn)環(huán)境

鏡像的生成途徑
- Dockerfile build
- 基于容器制作 commit
- Docker Hub automated builds
基于容器制作鏡像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image 改變dockerfile指令
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
例如:
docker run --name b1 -it busybox (啟動一個(gè)容器)
/ # mkdir /data/html -p
/ # vi /data/html/index.html
基于容器創(chuàng)建鏡像
docker commit -p b1
sha256:ae437fa992d9c8182cffcf60e382f8d15a44e26065871b447e2838421b9231a1
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ae437fa992d9 3 seconds ago 1.2MB
給鏡像打標(biāo)簽
docker tag ae437fa992d9 abao/bbox:v0.1
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
abao/bbox v0.1 ae437fa992d9 5 minutes ago 1.2MB
一個(gè)鏡像可以打多個(gè)標(biāo)簽:
docker tag abao/bbox:v0.1 abao/bbox:latest
鏡像創(chuàng)建完成后,啟動容器查看
docker run --name t1 -it abao/bbox:latest
/ # ls
bin data dev etc home proc root sys tmp usr var
/ # cat data/html/index.html
查看鏡像詳細(xì)信息
busybox container t1可以看到t1這個(gè)鏡像的詳細(xì)信息
"Cmd": [ #默認(rèn)執(zhí)行的指令,通過構(gòu)建鏡像時(shí)的-c可以更改
"sh"
],
docker commit -a "abao <abao@test.com>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 abao/bbox:v0.2
啟動鏡像
docker run --name t2 abao/bbox:v0.2
可以查看到
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ea4d55c5ad60 abao/bbox:v0.2 "/bin/httpd -f -h /d…" About a minute ago Up About a minute t2
也可以通過curl訪問到
docker push
docker login 先
docker push (如果不是push到docker hub,必須先打tag,tag包含服務(wù)器地址/名稱空間/倉庫名稱:標(biāo)簽)
鏡像的導(dǎo)入和導(dǎo)出
主機(jī)1:
docker save -o myimages.gz abao/bbox:v0.1 abao/bbox:v0.2
主機(jī)2:
docker load -i myimages.gz

浙公網(wǎng)安備 33010602011771號