docker镜像、容器以及命令操作
docker image
docker image是一個(gè)極度精簡(jiǎn)版的Linux程序運(yùn)行環(huán)境,官網(wǎng)的java鏡像包括的東西更少,除非是鏡像疊加方式的如centos+java7
docker image是需要定制化build的一個(gè)安裝包,包括基礎(chǔ)鏡像+應(yīng)用的二進(jìn)制部署包
docker image內(nèi)不建議有運(yùn)行期需要修改的配置文件
Dockerfile用來(lái)創(chuàng)建一個(gè)自定義的image,包含了用戶(hù)指定的軟件依賴(lài)等。當(dāng)前目錄下包含Dockerfile,使用命令build來(lái)創(chuàng)建新的image
docker image的最佳實(shí)踐之一是盡量重用和使用網(wǎng)上公開(kāi)的基礎(chǔ)鏡像
?
為docker添加國(guó)內(nèi)鏡像,加速下載鏡像:
修改配置文件/etc/docker/daemon.json,如果該文件沒(méi)有則進(jìn)行創(chuàng)建:
[root@docker ~]# cat /etc/docker/daemon.json {"dns": ["192.168.101.2","8.8.8.8"],"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] }然后重啟docker:
# systemctl restart docker?
關(guān)于image的一些命令:
搜索鏡像:
# docker search nginxnginx為鏡像名稱(chēng)(鏡像名稱(chēng)如:centos、nginx、redis)
拉取鏡像:
# docker pull nginx列出本地鏡像:
# docker images(docker images --help)# docker image ls -a 同樣是列出鏡像(docker image ls --help查看)刪除鏡像:
# docker rmi nginx (docker rmi image_name/image_id)# docker image rm nginx同樣是刪除鏡像(docker image rm image_name/image_id) -f:force強(qiáng)制刪除 note:如果鏡像被容器占用了,需要先刪除容器,才能刪除鏡像| 12345678910111213141516 | [root@aliyun ~]# docker image ls -q4760dc956b2d2d743d41a4ba57601981c9895cb13972bd2b5d4d51c57ea8006de56999d15fbc887a9773ffcdd49c4f06fed968450a879d95756f4947a92c139758db9b179c4d385eff426288ea903f8a4339aadd6704d778b3ba |
?
Docker container:
Docker container是image的實(shí)例,共享內(nèi)核
Docker? container里可以運(yùn)行不同os的image,比如Ubuntu的或者centos
Docker container不建議內(nèi)部開(kāi)啟一個(gè)sshd服務(wù),1.3版本后新增了docker exec命令進(jìn)入容器進(jìn)行排查問(wèn)題
Docker container沒(méi)有ip地址,通常不會(huì)有服務(wù)端口暴露,是一個(gè)封閉的沙盒
?
Docker daemon:
Docker daemon是創(chuàng)建和運(yùn)行container的Linux守護(hù)進(jìn)程,也是Docker 最主要的核心組件
Docker daemon可以理解為Docker container的container
Docker daemon可以綁定本地端口并提供REST API服務(wù),用來(lái)遠(yuǎn)程訪(fǎng)問(wèn)和控制
Docker container的一些命令操作:
?查看容器:
# docker ps查看所有的容器:
# docker ps -a啟動(dòng)一個(gè)容器:
# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container # docker run 啟動(dòng)一個(gè)容器并執(zhí)行命令(容器是本機(jī)host的一個(gè)進(jìn)程,如果進(jìn)程沒(méi)有后續(xù)操作,那么狀態(tài)將是exited)創(chuàng)建一個(gè)名稱(chēng)為mycentos的container,并執(zhí)行/bin/bash:
# docker run --name mycentos centos /bin/bash--name:表示容器的name,后面的centos表示使用的哪個(gè)鏡像(鏡像name)
? /bin/bash:表示執(zhí)行的command
容器可以使用容器id和容器name來(lái)識(shí)別(與鏡像類(lèi)似) 容器有狀態(tài)(exited表示已經(jīng)退出了)啟動(dòng)容器:# docker start mycentos關(guān)閉容器:
# docker stop mycentos刪除容器:
# docker rm mycentos上面的操作都可以使用容器的唯一標(biāo)識(shí)(容器名稱(chēng)或者容器id)
-f:force強(qiáng)制刪除
?
創(chuàng)建一個(gè)具有tty偽終端的容器:
# docker run -t --name mycentos centos /bin/bash [root@92f0af59184d /]#可以看見(jiàn)直接進(jìn)入到了容器的終端,但是由于沒(méi)有使用-i(交互功能,所以使用命令會(huì)卡住)
此時(shí)查看該容器狀態(tài):
查看本機(jī)host進(jìn)程:
可以看出進(jìn)程中包含的一長(zhǎng)串字符就是該容器的uuid,由于進(jìn)程沒(méi)有關(guān)閉所以容器狀態(tài)就是up
現(xiàn)在將容器關(guān)閉掉:
可以看見(jiàn)容器狀態(tài)已經(jīng)exited了
而相應(yīng)的本機(jī)host的進(jìn)程已經(jīng)結(jié)束了
note:docker的容器就是本機(jī)host的某一個(gè)包含容器uuid的進(jìn)程,進(jìn)程關(guān)閉了那么容器也就是停止了刪除所有的exited容器:# docker ps -a -q|xargs docker rm創(chuàng)建一個(gè)以后臺(tái)模式運(yùn)行的容器:
[root@docker ~]# docker run -d --name mycentos centos /bin/bash f61a3e75ebb5f78d1f593e7c92bf2a997077abc38287991818749550367b8150-d:以后臺(tái)模式創(chuàng)建,返回容器的uuid因?yàn)閯?chuàng)建的只是一個(gè)后臺(tái)運(yùn)行的容器,容器并沒(méi)有被安排操作其他的命令(/bin/bash),所以容器的狀態(tài)還是exited,本機(jī)host的進(jìn)程是沒(méi)有這個(gè)容器的創(chuàng)建一個(gè)以后臺(tái)模式運(yùn)行不間斷的容器:[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 5ef7fa20faa1071ad1a6eff2241368b113cbf45e1b89c6a292907a4f1a3e4269為什么這里的容器狀態(tài)一直是up,那是因?yàn)閳?zhí)行的命令:sh -c "while true;do echo hello world;sleep 2;done" 是在容器中每隔2s打印一次hello world,并一直循環(huán)下去查看本機(jī)host的進(jìn)程也能看見(jiàn),進(jìn)程一直處于運(yùn)行狀態(tài)將運(yùn)行的容器stop就可以停止掉容器# docker stop mycentos可以將停止的狀態(tài)處于運(yùn)行狀態(tài)(當(dāng)然前提是容器的命令必須有運(yùn)行的執(zhí)行)# docker start mycentos?-t與命令/bin/bash結(jié)合進(jìn)入到了終端,但是卻不能操作:
[root@docker ~]# docker run -t --name test saltstack/ubuntu-14.04 /bin/bash root@b588c6131109:/# ls上述在終端不具有交互功能,于是加上-i:
[root@docker ~]# docker run -it --name mycentos centos /bin/bash [root@176f5440f328 /]# ls anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var創(chuàng)建一個(gè)進(jìn)入到了容器終端,并能執(zhí)行交互命令的容器-i:interactive具有交互功能/bin/bash:進(jìn)入到bash環(huán)境-t:提供偽終端[root@176f5440f328 /]# exit exitexit:表示退出了容器的終端退出容器終端后,容器狀態(tài)也是退出了,本機(jī)host進(jìn)程也停止運(yùn)行了容器的狀態(tài)會(huì)隨著command的命令執(zhí)行而改變?nèi)绻枰獙⑷萜鞒掷m(xù)不斷的運(yùn)行,那么將command變?yōu)槌掷m(xù)不斷的運(yùn)行就可以[root@docker ~]# docker run -dt --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 8179b8e95e31675986ccda57bb95650d6ea460105e23a67a4e692b7966354250創(chuàng)建的一個(gè)持續(xù)不斷運(yùn)行的container(命令是隔兩秒打印一次的不中斷的)可以用docker stop container_id 進(jìn)行停止(停止后就可以刪掉了)停止全部container,并刪除:?
docker exec和nsenter的區(qū)別:
[root@docker ~]# docker exec --helpUsage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]Run a command in a running container現(xiàn)在創(chuàng)建一個(gè)一直運(yùn)行的container:
[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 292cf95a7853e70978657d7c05f7abd4bff27f1c4e73d97a32b4639d1c0165fc[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 292cf95a7853 centos "sh -c 'while true..." 3 seconds ago Up 3 seconds mycentosdocker exec表示在一個(gè)運(yùn)行的container中執(zhí)行命令
Options:-d, --detach Detached mode: run command in the background--detach-keys string Override the key sequence for detaching a container-e, --env list Set environment variables--help Print usage-i, --interactive Keep STDIN open even if not attached--privileged Give extended privileges to the command-t, --tty Allocate a pseudo-TTY-u, --user string Username or UID (format: <name|uid>[:<group|gid>])執(zhí)行某一個(gè)命令ls /
[root@docker ~]# docker exec -it 292cf95a7853 ls / anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var還可以標(biāo)準(zhǔn)輸入命令:
[root@docker ~]# docker exec 292cf95a7853 echo hello hello當(dāng)docker exec執(zhí)行如下可以進(jìn)入到container中:
同等的nsenter命令也可以完全進(jìn)入到container中:
如果沒(méi)有這個(gè)命令需要進(jìn)行安裝:yum install?util-linux
1、確定該container的pid:
[root@docker ~]# docker inspect -f {{.State.Pid}} 292cf95a7853 275152、使用nsenter連接:
[root@docker ~]# nsenter --target `docker inspect -f {{.State.Pid}} 292cf95a7853` --net --ipc --pid --mount --uts [root@292cf95a7853 /]# ls anaconda-post.log bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr varnsenter是關(guān)于namespace命名空間的命令,能夠是一些資源能夠進(jìn)行隔離
PID:進(jìn)程隔離(process id)NET:網(wǎng)絡(luò)接口(network)IPC:管理跨進(jìn)程通信的訪(fǎng)問(wèn)(interprocess communication)MNT:管理掛載點(diǎn)(mount)UTS:隔離內(nèi)核和版本標(biāo)識(shí)(unix timesharing system)USER:隔離用戶(hù)總結(jié)
以上是生活随笔為你收集整理的docker镜像、容器以及命令操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java抽象类详解
- 下一篇: docker之container