docker鏡像、容器以及命令操作


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 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強制刪除
  note:如果鏡像被容器占用了,需要先刪除容器,才能刪除鏡像
[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
  [root@docker ~]# ll
  total 200420
  -rw-------. 1 root root 1249 Oct 27 04:52 anaconda-ks.cfg
  -rw-------. 1 root root 205225472 Oct 27 15:22 centos.tar
將本地包導入到鏡像中:
# 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

容器可以使用容器id和容器name來識別(與鏡像類似)
容器有狀態(exited表示已經退出了)
啟動容器:
# 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的進程已經結束了

note:docker的容器就是本機host的某一個包含容器uuid的進程,進程關閉了那么容器也就是停止了
刪除所有的exited容器:
# docker ps -a -q|xargs docker rm

創建一個以后台模式運行的容器:

[root@docker ~]# docker run -d --name mycentos centos /bin/bash
f61a3e75ebb5f78d1f593e7c92bf2a997077abc38287991818749550367b8150
  -d:以后台模式創建,返回容器的uuid
因為創建的只是一個后台運行的容器,容器並沒有被安排操作其他的命令(/bin/bash),所以容器的狀態還是exited,本機host的進程是沒有這個容器的
 
創建一個以后台模式運行不間斷的容器:
[root@docker ~]# docker run -d --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 
5ef7fa20faa1071ad1a6eff2241368b113cbf45e1b89c6a292907a4f1a3e4269

為什么這里的容器狀態一直是up,那是因為執行的命令:sh -c "while true;do echo hello world;sleep 2;done" 是在容器中每隔2s打印一次hello world,並一直循環下去
查看本機host的進程也能看見,進程一直處於運行狀態
將運行的容器stop就可以停止掉容器
# 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
  創建一個進入到了容器終端,並能執行交互命令的容器
  -i:interactive具有交互功能
  /bin/bash:進入到bash環境
  -t:提供偽終端
[root@176f5440f328 /]# exit
exit
  exit:表示退出了容器的終端
  退出容器終端后,容器狀態也是退出了,本機host進程也停止運行了
  容器的狀態會隨着command的命令執行而改變
  如果需要將容器持續不斷的運行,那么將command變為持續不斷的運行就可以
[root@docker ~]# docker run -dt --name mycentos centos sh -c "while true;do echo hello world;sleep 2;done" 
8179b8e95e31675986ccda57bb95650d6ea460105e23a67a4e692b7966354250
創建的一個持續不斷運行的container(命令是隔兩秒打印一次的不中斷的)
可以用docker stop container_id 進行停止(停止后就可以刪掉了)
停止全部container,並刪除:

 

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命名空間的命令,能夠是一些資源能夠進行隔離

  PID:進程隔離(process id)
  NET:網絡接口(network)
  IPC:管理跨進程通信的訪問(interprocess communication)
  MNT:管理掛載點(mount)
  UTS:隔離內核和版本標識(unix timesharing system)
  USER:隔離用戶


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM