docker image
docker image是一個極度精簡版的Linux程式執行環境,官網的java映象包括的東西更少,除非是映象疊加方式的如centos+java7
docker image是需要定製化build的一個安裝包,包括基礎映象+應用的二進位制部署包
docker image內不建議有執行期需要修改的配置檔案
Dockerfile用來建立一個自定義的image,包含了使用者指定的軟體依賴等。當前目錄下包含Dockerfile,使用命令build來建立新的image
docker image的最佳實踐之一是儘量重用和使用網上公開的基礎映象
為docker新增國內映象,加速下載映象:
修改配置檔案/etc/docker/daemon.json,如果該檔案沒有則進行建立:
[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
關於image的一些命令:
搜尋映象:
# docker search nginx
nginx為映象名稱(映象名稱如:centos、nginx、redis)
拉取映象:
# docker pull nginx
列出本地映象:
# docker images(docker images --help)
刪除映象:
# docker rmi nginx (docker rmi image_name/image_id)
[root@aliyun ~]# docker image ls -q 4760dc956b2d 2d743d41a4ba 57601981c989 5cb13972bd2b 5d4d51c57ea8 006de56999d1 5fbc887a9773 ffcdd49c4f06 fed968450a87 9d95756f4947 a92c139758db 9b179c4d385e ff426288ea90 3f8a4339aadd 6704d778b3ba
# docker save -o centos.tar centos
# docker load --input centos.tar
Docker container:
Docker container是image的例項,共享核心
Docker container裡可以執行不同os的image,比如Ubuntu的或者centos
Docker container不建議內部開啟一個sshd服務,1.3版本後新增了docker exec命令進入容器進行排查問題
Docker container沒有ip地址,通常不會有服務埠暴露,是一個封閉的沙盒
Docker daemon:
Docker daemon是建立和執行container的Linux守護程式,也是Docker 最主要的核心元件
Docker daemon可以理解為Docker container的container
Docker daemon可以繫結本地埠並提供REST API服務,用來遠端訪問和控制
Docker container的一些命令操作:
檢視容器:
# docker ps
檢視所有的容器:
# docker ps -a
啟動一個容器:
# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container # docker run 啟動一個容器並執行命令(容器是本機host的一個程式,如果程式沒有後續操作,那麼狀態將是exited)
建立一個名稱為mycentos的container,並執行/bin/bash:
# docker run --name mycentos centos /bin/bash
--name:表示容器的name,後面的centos表示使用的哪個映象(映象name)
/bin/bash:表示執行的command
# docker start mycentos
關閉容器:
# docker stop mycentos
刪除容器:
# docker rm mycentos
上面的操作都可以使用容器的唯一標識(容器名稱或者容器id)
-f:force強制刪除
建立一個具有tty偽終端的容器:
# docker run -t --name mycentos centos /bin/bash
[root@92f0af59184d /]#
可以看見直接進入到了容器的終端,但是由於沒有使用-i(互動功能,所以使用命令會卡住)
此時檢視該容器狀態:
檢視本機host程式:
可以看出程式中包含的一長串字元就是該容器的uuid,由於程式沒有關閉所以容器狀態就是up
現在將容器關閉掉:
可以看見容器狀態已經exited了
而相應的本機host的程式已經結束了
# docker ps -a -q|xargs docker rm
建立一個以後臺模式執行的容器:
[root@docker ~]# docker run -d --name mycentos centos /bin/bash
f61a3e75ebb5f78d1f593e7c92bf2a997077abc38287991818749550367b8150
[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 5ef7fa20faa1071ad1a6eff2241368b113cbf45e1b89c6a292907a4f1a3e4269
# docker stop mycentos
# docker start mycentos
-t與命令/bin/bash結合進入到了終端,但是卻不能操作:
[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
[root@176f5440f328 /]# exit
exit
[root@docker ~]# docker run -dt --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 8179b8e95e31675986ccda57bb95650d6ea460105e23a67a4e692b7966354250
docker exec和nsenter的區別:
[root@docker ~]# docker exec --help Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] Run a command in a running container
現在建立一個一直執行的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 mycentos
docker exec表示在一個執行的container中執行命令
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>])
執行某一個命令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
還可以標準輸入命令:
[root@docker ~]# docker exec 292cf95a7853 echo hello hello
當docker exec執行如下可以進入到container中:
同等的nsenter命令也可以完全進入到container中:
如果沒有這個命令需要進行安裝:yum install util-linux
1、確定該container的pid:
[root@docker ~]# docker inspect -f {{.State.Pid}} 292cf95a7853 27515
2、使用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 var
nsenter是關於namespace名稱空間的命令,能夠是一些資源能夠進行隔離