中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker 基礎知識

發布時間:2020-08-01 02:12:25 來源:網絡 閱讀:404 作者:騎士救兵 欄目:云計算

容器基礎知識

容器級虛擬化,不再為每一個虛擬機創建單獨的內核,而是通過在宿主機的內核上將6種資源通過內核機制(namespaces)隔離出來,每一個namespace就是一個單獨的容器。
Linux領域的容器技術,就是靠內核級的6個namespaces、chroot和Cgroups共同實現的。

Namespaces

隔離用戶空間,將進程與其他進程隔離開來。

namesapce 系統調用參數 隔離內容 內核版本
Mount CLONE_NEWNW 掛載點(文件系統) 2.4.19
UTS CLONE_NEWUTS 主機名和域名 2.6.19
IPC CLONE_NEWIPC 信號量、消息隊列和共享內存 2.6.19
PID CLONE_NEWPID 進程編號 2.6.24
Network CLONE_NEWNET 網絡設備、網絡棧、端口等 2.6.29
User CLONE_NEWUSER 用戶和用戶組 3.8

最后一個是在內核的3.8版本才加入到內核中的。所以要想很好的使用容器技術,內核版本需要在3.8之后,也就是需要Centos7。

Control Groups(cgroups)

容器化技術的隔離機制是靠namespaces實現,而容器化的資源分配靠的是在內核級通過CGroups機制實現。它會把系統級的資源分成多個組,然后把每一個組內的資源量指派分配到特定的namespace的進程上去。
cgroups,資源限制,限制進程占用的CPU和內存:

  • blkio: 塊設備IO
  • cpu: CPU
  • cpuacct: CPU資源使用報告
  • cpuset: 多處理器平臺上的CPU集合
  • devices: 設備訪問
  • freezer: 掛起或恢復任務
  • memory: 內存用量及報告
  • perf_event: 對cgroup中的任務進行統一性能測試
  • net_cls: cgroup中的任務創建的數據報文的類別標識符

CPU屬于可壓縮資源。內存屬于非可壓縮資源,絕對不允許越界。

容器編排工具

Docker三大編排工具:

  • Docker Compose:是用來組裝多容器應用的工具,可以在 Swarm集群中部署分布式應用。
  • Docker Swarm:是Docker社區原生提供的容器集群管理工具。
  • Docker Machine:是支持多平臺安裝Docker的工具,可以很方便地在筆記本、云平臺及數據中心里安裝Docker。

Compose是單機版。Swarm是集群管理工具。

以上這些可能都用不到,因為最流行的還是下面這個。
kubernetes:簡稱K8s,Google開源的一個容器編排引擎。

k8s需要作為一個單獨的主題,另外再去學習的工具,這里只是把工具的名稱引出來。

Docker 架構

Docker架構如下,有3個部分組成。
Docker 基礎知識

這里有Client端和Server端(DOCKER_HOST),所以這是一個C/S架構的應用程序。

Docker daemon

Docker deamon運行為守護進程。所以運行后這臺主機就變成了守護進程服務器
Docker daemon 監聽UNIX套接字或網絡接口。默認只監聽本地的UNIX套接字。

Images 鏡像,可以從registries下載鏡像。所有鏡像都是只讀的。
Containers 容器,啟動容器時是基于鏡像來啟動。

Docker client

客戶端是用戶操作Docker的主要方式。docker命令使用Docker API,客戶端可以與多個daemon進行通信。

Docker registries

Docker的鏡像倉庫。
Docker Hub(https://hub.docker.com/ ),官方提供的鏡像倉庫,在國外。建議使用國內鏡像。

安裝docker

在Centos7上使用yum安裝docker。

CentOS官方源

CentOS官方源就有docker,注意這里用的名稱是docker:

$ yum info docker
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.163.com
可安裝的軟件包
名稱    :docker
架構    :x86_64
時期       :2
版本    :1.13.1
發布    :96.gitb2f74b2.el7.centos
大小    :18 M
源    :extras/7/x86_64
簡介    : Automates deployment of containerized applications
網址    :https://github.com/docker/docker
協議    : ASL 2.0
描述    : Docker is an open-source engine that automates the deployment of any
         : application as a lightweight, portable, self-sufficient container that will
         : run virtually anywhere.
         : 
         : Docker containers can encapsulate any payload, and will run consistently on
         : and between virtually any server. The same container that a developer builds
         : and tests on a laptop will run at scale, in production*, on VMs, bare-metal
         : servers, OpenStack clusters, public instances, or combinations of the above.

$ 

但是這個的版本太低了,所以不使用CentOS的源。

Docker的版本

現在Docker軟件主要有兩個版本:

  • Docker-CE: 社區版本,這是一個免費的版本
  • Docker-EE: 企業版本,這是一個付費的版本

Docker另外還有一個開源的版本Moby,這個也是從原先的docker項目繼承過來,是社區維護的。而Docker-CE是Docoker公司維護的開源項目。

添加Docker-CE源

這里添加阿里的鏡像源,這個是社區版Docker-CE:

$ wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

檢查版本信息,注意這里用的名稱是docker-ce:

$ yum info docker-ce
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
可安裝的軟件包
名稱    :docker-ce
架構    :x86_64
時期       :3
版本    :18.09.7
發布    :3.el7
大小    :19 M
源    :docker-ce-stable/x86_64
簡介    : The open-source application container engine
網址    :https://www.docker.com
協議    : ASL 2.0
描述    : Docker is is a product for you to build, ship and run any application as a
         : lightweight container.
         : 
         : Docker containers are both hardware-agnostic and platform-agnostic. This means
         : they can run anywhere, from your laptop to the largest cloud compute instance and
         : everything in between - and they don't require you to use a particular
         : language, framework or packaging system. That makes them great building blocks
         : for deploying and scaling web apps, databases, and backend services without
         : depending on a particular stack or provider.

$

注意版本兼容性

上面顯示的最新版本信息是18.09.7,由于docker一般還要配合容器編排工具使用,現在最流行的就是k8s。而k8s還不一定支持最新版本,所以具體要安裝那個版本,還得確認一下版本的依賴關系。
查詢k8s對docker版本的依賴關系,可以到Github的k8s的項目中,項目地址:
https://github.com/kubernetes/kubernetes
查詢版本的CHANGELOG,比如這個文件CHANGELOG-1.15.md。文件內容比較多,直接搜索“Docker version”:

The list of validated docker versions remains unchanged.
The current list is 1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09. (#72823, #72831)

安裝指定版本的docker

這里就安裝一個不是最新的18.06版本。

查詢可用版本:

$ yum list docker-ce --showduplicates | expand
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
可安裝的軟件包
docker-ce.x86_64            17.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.03.3.ce-1.el7                    docker-ce-stable
docker-ce.x86_64            17.06.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.06.2.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            17.12.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.0.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.03.1.ce-1.el7.centos             docker-ce-stable
docker-ce.x86_64            18.06.0.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.1.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.2.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            18.06.3.ce-3.el7                    docker-ce-stable
docker-ce.x86_64            3:18.09.0-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.3-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.4-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.6-3.el7                     docker-ce-stable
docker-ce.x86_64            3:18.09.7-3.el7                     docker-ce-stable
$ 

expand 命令的效果只是讓輸出更加緊湊一點,把制表符換成空格。

安裝指定版本:

yum install docker-ce-18.06.0.ce-3.el7

啟動和驗證
啟動服務、開機啟動,查看版本信息:

$ systemctl start docker.service
$ systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
$ docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false
$

這里能分別看到Client端和Server端各自的版本。Docker是用Go語言開發的,這里有顯示Go的版本。另外還有平臺的版本linux/amd64,這個之后使用或下載其他組件時,遇到有平臺相關的版本兼容性問題,可以根據這個選擇對應的版本。

使用鏡像加速器

默認的鏡像倉庫在國外,最好使用在國內的官方鏡像站點。這里列出了幾個:

  • 阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
  • 網易加速器:http://hub-mirror.c.163.com
  • 官方中國加速器:https://registry.docker-cn.com
  • 中國科技大學的鏡像:https://docker.mirrors.ustc.edu.cn

阿里云的不能直接使用,因為需要注冊,效果應該會很不錯。
docker-cn雖然是官方的,但是加速效果也很差。大概是不了解國情。
網易和中科大的都可以使用。
使用配置文件/etc/docker/daemon.json,如果目錄或文件沒有,就手動創建。在配置文件中添加如下內容:

{
    "registry-mirrors": ["http://hub-mirror.c.163.com", "https://registry.docker-cn.com"]
}

這里的配置使用的是JSON格式。要是配置生效,需要重啟服務。

配置文件

上面只是使用了一個配置項,完整的配置項信息可以查看官方的文檔:
https://docs.docker.com/engine/reference/commandline/dockerd/#Daemon-configuration-file
應該是所有的配置項都在這里了,之后需要的時候可以再來查閱。

Docker 命令

不使用任何參數執行 docker 打印的幫助信息如下:

$ docker

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/root/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

Management Commands:
  config      Manage Docker configs
  container   Manage containers
  image       Manage images
  network     Manage networks
  node        Manage Swarm nodes
  plugin      Manage plugins
  secret      Manage Docker secrets
  service     Manage services
  stack       Manage Docker stacks
  swarm       Manage Swarm
  system      Manage Docker
  trust       Manage trust on Docker images
  volume      Manage volumes

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker COMMAND --help' for more information on a command.
$ 

子命令

這里有 Management Commands 和 Commands。docker有很多子命令,早期的docker是Commands風格的,每一個子命令都是單獨的。現在命令多了,為這些子命令分了很多組進行管理,這個就是Management Commands。所以兩種命令風格效果是一樣的。比如,下面兩個命令是一樣的:

docker run
docker container run

建議盡量使用 Management Commands 的命令。

Go 命令的調用流程
這里是題外話,這么好的命令行界面,好奇是具體怎么做的。
使用了golang命令行庫cobra:https://github.com/spf13/cobra。
具體可以看下這篇文章的分析:https://www.jianshu.com/p/9900ec52f2c1
有一點可能需要注意,Docker的設計是Client-Server模式的,平時我們用的docker這個命令被分散到 https://github.com/docker/cli 這個倉庫去了。

詳細系統信息

之前使用docker version命令,查看了版本信息,這個使用docker info命令可以查看更詳細的信息:

$ docker system info
Containers: 0  // 總的容器數量
 Running: 0    // 運行狀態的容器數量
 Paused: 0     // 暫停狀態的容器數量
 Stopped: 0    // 停止狀態的容器數量
Images: 0      // 鏡像的數量
Server Version: 18.06.0-ce  // 服務器版本
Storage Driver: overlay2    // 存儲驅動后端
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:  // 插件
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d64c661f1d51c48782c9cec8fda7604785f93587
runc version: 69663f0bd4b60df09991c08812a60108003fa340
init version: fec3683
Security Options:  // 安全選項
 seccomp
  Profile: default
Kernel Version: 3.10.0-957.el7.x86_64  // 內核版本
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 908.2MiB
Name: Docker
ID: HB7V:B35V:AGQR:Z4JM:WLZ3:T53Y:DXAD:R3HE:OIMS:ODXL:QKDB:MQES
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:  // 鏡像加速器
 http://hub-mirror.c.163.com/
 https://registry.docker-cn.com/
Live Restore Enabled: false

$ 

以上部分信息,我用類似注釋的方式在對應的行里加了說明。

networ 網絡

查看容器可以使用的網絡:

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
39cd19b7d266        bridge              bridge              local
d086953087bb        host                host                local
fa0c7f1fb6ca        none                null                local
$

容器網絡的內容也是需要單獨展開的,這里只是演示一下網絡命令。

搜索鏡像

可以使用命令來搜索鏡像:docker search。這個命令不屬于任何一個Management Commands,所以就直接這么用:

$ docker search nginx

命令的輸出結果貼出來不是很好看,下面是利用--format參數,輸出完整的JSON格式的內容:

$ docker search nginx --limit 5 --format '{{json .}}'
{"Description":"Official build of Nginx.","IsAutomated":"false","IsOfficial":"true","Name":"nginx","StarCount":"11680"}
{"Description":"Automated Nginx reverse proxy for docker con…","IsAutomated":"true","IsOfficial":"false","Name":"jwilder/nginx-proxy","StarCount":"1627"}
{"Description":"Container running Nginx + PHP-FPM capable of…","IsAutomated":"true","IsOfficial":"false","Name":"richarvey/nginx-php-fpm","StarCount":"726"}
{"Description":"Bitnami nginx Docker Image","IsAutomated":"true","IsOfficial":"false","Name":"bitnami/nginx","StarCount":"69"}
{"Description":"NGINX Ingress Controller for Kubernetes","IsAutomated":"false","IsOfficial":"false","Name":"nginx/nginx-ingress","StarCount":"20"}

這里不但獲取了所有的字段的內容,還有每個字段的字段名。
現在還可以調整--format參數,自定義輸出的格式:

$ docker search nginx --limit 5 --format '{{.Name}}\t{{.Description}}\t{{.StarCount}}\t{{.IsOfficial | printf "%q"}}\t{{.IsAutomated | printf "%q"}}'
nginx   Official build of Nginx.        11680   "[OK]"  ""
jwilder/nginx-proxy     Automated Nginx reverse proxy for docker con…   1627    ""      "[OK]"
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of…   726     ""      "[OK]"
bitnami/nginx   Bitnami nginx Docker Image      69      ""      "[OK]"
nginx/nginx-ingress     NGINX Ingress Controller for Kubernetes 20      ""      ""
$ 

默認輸出的內容如果太長,會被階段,比如Description字段。這時可以使用--no-trunc參數,阻止內容被截斷。

不過搜索的結構沒有詳細的tag信息,所以這個命令沒太大用處。要搜索鏡像就直接上 hub.docker.com 查。
Docker Hub 搜索鏡像
使用瀏覽器訪問docker hub: https://hub.docker.com/
在首頁搜索框內輸入要搜索的鏡像名稱,比如“hello-world”。進入后,點擊TAGS標簽,可以查看這個鏡像的不同的版本。

其他鏡像倉庫
除了Docker Hub官方的鏡像倉庫以外,還有其他鏡像倉庫,比如Quay:https://quay.io/

image 鏡像操作

首先要在本地創建鏡像,可以去鏡像倉庫獲取。

拉取鏡像

把鏡像從鏡像倉庫拖(pull)下來:

$ docker image pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest
$ 

如果不指定tag,默認就是latest。

查看下載的鏡像

查看就是ls:

$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        6 months ago        1.84kB
$

這里的 IMAGE ID 是鏡像的唯一標識。指定鏡像的時候可以使用 REPOSITORY 和 TAG,不過本地鏡像可以沒有這兩個屬性。但是一定會有 IMAGE ID,通過 IMAGE ID 也可以指明鏡像。

上面顯示的ID只是一部分,可以使用--no-trunc參數查看完整的:

$ docker image ls --no-trunc --format '{{.Repository}}:{{.Tag}} {{.ID}}'
hello-world:latest sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
$ 

在指明鏡像的時候,使用完整的或者部分ID都是可以的。

刪除本地鏡像

如果下錯了,或者不用了,也可以刪除。命令是docker image rm,或者也可以用docker rmi
注意,這里不是docker rm,這個命令操作的容器,對應的命令是docker container rm
這也是建議使用 Management Commands 命令的原因,明確指定要做哪一類的操作。這樣在需要操作 image 的時候不會因為誤操作而對 container 執行了命令。

container 容器操作

先看下一幫助命令,下面是所有容器相關的子命令:

$ docker container --help

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a running container
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  inspect     Display detailed information on one or more containers
  kill        Kill one or more running containers
  logs        Fetch the logs of a container
  ls          List containers
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  prune       Remove all stopped containers
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  run         Run a command in a new container
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes

Run 'docker container COMMAND --help' for more information on a command.
$ 

主要命令說明:

  • create: 創建一個容器,創建的容器是stop狀態,要啟動需要start。
  • start: 啟動容器。
  • stop:: 停止容器。
  • kill: 強行停止容器。
  • run: 創建后直接啟動容器。這個比較常用。
  • rm: 刪除容器。
  • pause: 暫停容器。
  • unpause: 取消暫停。
  • top: 查看容器的資源消耗,類型Linux的top命令。
  • ls: 顯示容器,類似Linux的ps命令,所以可以直接用 docker ps。

run 命令

執行 docker container run --help 查看命令運行的格式:

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

啟動容器時執行的命令
[COMMAND] 是可選的,指定啟動容器時運行的命令。
[ARG...] 是像命令傳遞的參數。

Docker的容器是為了運行單個程序的。就是單個進程,不過容器內部也是可以同時運行多個進程的。
每個鏡像都有定義默認要運行的程序。基于一個鏡像啟動容器的時,如果沒有指定命令,就執行鏡像默認指定的程序。
當然也可以手動指定鏡像啟動時運行的命令,就是上面的[COMMAND]參數。

啟動容器時的選項
[OPTIONS] 是一大堆run命令的參數。下面挑幾個重要的說:

  • -t, --tty: 分配一個終端。如果要運行為交互式接口,要打開shell,沒有終端是無法打開shell的。
  • -i, --interactive: 進行交換式訪問。一般都是-it,兩個參數配合使用的。
  • --name string: 給啟動的容器一個名字。
  • --network string: 啟動容器時指定連接的網絡。不指定就用默認的,默認加入bridge網絡。
  • --rm: 容器一旦停止,就自動將容器刪除。
  • -d, --detach: 讓容器直接運行在后臺。否則會一直占據著終端。

busybox

這里來實際的運行個容器,并進行各種操作。
busybox的鏡像非常小,它并不是一個系統發行版。最初這個工具是為了在一張軟盤上創建一個可引導的 GNU/Linux 系統,這可以用作安裝盤和急救盤。它是一個集成了三百多個最常用Linux命令和工具的軟件。

直接啟動
直接將鏡像啟動為容器:

$ docker container run --name bx0 busybox
$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$

此時ls也看不到這個容器,不過容器并沒有被刪除而只是出于停止狀態。默認只顯示運行狀態的容器,這里需要加上-a參數:

$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
3a9b8eb31e01        busybox             "sh"                7 minutes ago       Exited (0) 7 minutes ago                       bx0
$ 

這里注意一下 COMMAND 字段的值,這個是容器啟動時運行的命令。啟動容器的時候沒有指定,這里就是默認的命令。
這次啟動容器顯然是有問題的,先把這個容器刪除了,然后繼續往下看:

$ docker container rm bx0

啟動并開啟終端
這次啟動時加上 -it 參數,分配一個 shell 終端:,

$ docker run --name bx1 -it busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls bin

最后的一條命令 ls bin 可以看到很多命令。這些命令就是 busybox 支持的命令。

現在是一個 shell 的交互式接口,可以直接運行命令,先看下 ps 命令:

/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   10 root      0:00 ps
/ # 

可以看到 sh 命令的 PID 是1。PID為1的進程是init

Docker 容器啟動時,默認會把容器內部第一個進程,也就是pid=1的程序,作為docker容器是否正在運行的依據,如果 docker 容器pid=1的進程掛了,那么docker容器便會直接退出。

此時如果退出shell,那么這個容器也就關閉了。第一次啟動容器時,沒有開啟終端,其實就是啟動了一個 sh 命令,然后就退出終端了。所以啟動后容器就是停止狀態的。

/ # exit
$ docker container ls -a --format '{{.Names}}: {{.Status}}'
bx1: Exited (126) 4 minutes ago
$ 

再次啟動容器
容器已經創建好了,這次直接 start 就可以了:

$ docker container start bx1
bx1
$ docker container ls -a --format '{{.Names}}: {{.Status}}'
bx1: Up 2 seconds
$ 

但是現在并沒有進入到終端。

用 attach 命令就可以再次進入終端:

$ docker container attach bx1
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    6 root      0:00 ps
/ # 

還可以在 start 的時候直接加上 -ai 參數,效果也是一樣的:

/ # exit
$ docker container start bx1 -ai
/ # 

exec 命令
最后還有一種方法,不用進入宿主機,直接在宿主機上對容器發送命令,并在宿主機上得到命令的結果:

$ docker container start bx1
bx1
$ docker container exec bx1 ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    6 root      0:00 ps
$ 

小結

這里有張圖,描述了容器的各個常用命令和容器狀態的轉換:
Docker 基礎知識
圖里有個OOM(Out Of Memory)內存不足,是內存使用過多。OOM狀態的容器會被kill掉,來保證系統的可持續運行。OOM被kill之后就看容器的機制,是否會自動重啟,否則就進入stopped狀態。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灌云县| 永康市| 余干县| 石楼县| 洪泽县| 东乌| 东至县| 通辽市| 四会市| 海口市| 女性| 黎川县| 彭州市| 师宗县| 东阳市| 高密市| 宿迁市| 邯郸市| 嘉祥县| 绵竹市| 叶城县| 滨海县| 朔州市| 涟源市| 岱山县| 东乌| 疏勒县| 名山县| 金寨县| 延寿县| 新绛县| 县级市| 张家界市| 上杭县| 肥乡县| 天水市| 南雄市| 建平县| 施甸县| 合肥市| 曲水县|