Docker速学(一) 镜像和容器

了解Docker基本原理和要掌握的内容之后,我们就正式开始Docker的学习了。本篇内容主要介绍Docker的镜像和容器。

上篇回顾:Docker小白入门建议及基本原理介绍。下一篇预告:环境变量、数据卷等。

下面,一起来开始学习吧!

镜像

原理

如果只考虑 Docker 容器的操作系统属性,那么镜像=轻量级操作系统安装包。

如果需考虑 Docker 容器的应用软件属性,那么镜像=(轻量级操作系统+应用)安装包

例如:MySQL 镜像= 虚拟的 Linux 操作系统 + MySQL

镜像是怎么产生的?

用户编写镜像编排 Dockerfile,对这种文件进行 build 操作,就生成了一个镜像。

img

镜像是一个文件?

镜像从逻辑上可以简单理解是一个文件,但实际上是多层文件的组合。

所以,镜像虽然不是一个单独的文件,但可以被导出成为一个压缩文件:

# 镜像导出成一个tarball文件
docker save image

# 加载一个 tarball 镜像文件
docker load image

镜像存放在哪里?

运行容器时,Docker 会从 /var/lib/docker/image 目录下寻找是否镜像文件。

如果没有镜像文件,Docker 会尝试从 Dockerhub 镜像仓库 (opens new window)中下载到本地,然后运行。

仓库

众所周知,DockerHub 是由 Docker 官方运营的全球最大的镜像仓库。

实际上,除了 DockerHub 之外,还有多种构建仓库的方式:

自建仓库

支持自建仓库。一般云提供商均提供了镜像仓库服务,供客户存放自己的私有镜像。

加速仓库

如果从 Dockerhub 下载镜像镜像非常慢的话,就需要通过如下的方式修改仓库地址:

  1. 选择或获取你喜欢的国内镜像仓库(加速地址)

    #1 Docker 中文社区
    https://registry.docker-cn.com
    
    #2 网易仓库
    http://hub-mirror.c.163.com
    
    #3 腾讯仓库
    https://mirror.ccs.tencentyun.com
    
    #4 阿里云仓库
    https://f53jxx8r.mirror.aliyuncs.com
    

    上述阿里云仓库加速地址仅供参考,建议登录控制台后,从后台获取 (opens new window)获取

  2. 修改 /etc/docker/daemon.json 文件(如果没有可以增加),插入下值

    {
      "registry-mirrors": ["https://f53jxx8r.mirror.aliyuncs.com"]
    }
    
  3. 重启服务后生效

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
  4. Docker 支持配置多个仓库地址,类似:

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

容器

容器是 Docker 最重要的组件,上面已经多次提到容器就是一个轻量级虚拟机。

img

运行容器

通过 docker run 命令运行容器,它的用法和参数如下(详情 (opens new window))。

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cgroupns string                Cgroup namespace to use (host|private)
                                       'host':    Run the container in the Docker host's cgroup namespace
                                       'private': Run the container in its own private cgroup namespace
                                       '':        Use the cgroup namespace as configured by the
                                                  default-cgroupns-mode option on the daemon (default)
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print container ID
      --detach-keys string             Override the key sequence for detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --domainname string              Container NIS domain name
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --gpus gpu-request               GPU devices to add to the container ('all' to pass all GPUs)
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to initialize before starting health-retries countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that forwards signals and reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network network                Connect a container to a network
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --platform string                Set platform if server is multi-platform capable
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --pull string                    Pull image before running ("always"|"missing"|"never") (default "missing")
      --read-only                      Mount the container's root filesystem as read only
      --restart string                 Restart policy to apply when a container exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format: <name|uid>[:<group|gid>])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

下面我们通过一个简单的示例,介绍如何运行一个容器:

  1. 找到一个 Docker 镜像,例如:MySQL(opens new window)

  2. 运行如下的命令启动一个 MySQL 容器

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:tag
    
  3. 容器运行成功后,运行如下命令即可开始使用 MySQL 的客户端命令

    docker exec -it mysql mysql -uroot -p123456
    

上述示例我们完成如下几个工作:

  • 通过镜像页面找到运行容器的方案
  • 运行一个容器
  • 进入一个容器

创建镜像

Docker 的原理表明,容器的内核有一部分共享的 Docker 镜像的不变文件,另外一部分是可变文件。

所以,容器也可以很方便的转换成镜像。具体操作如下:

  1. 运行 docker ps 命令获取容器的 ID 号

  2. 将容器导出为压缩文件

    # 容器导出成 tarball 文件
    docker export -o mysql-`date +%Y%m%d`.tar f9fc8627b7fe
    
    # 查看文件
    ls mysql-`date +%Y%m%d`.tar
    
  3. 将压缩文件转换成镜像

    docker import  mysql-20210416.tar mysql-test  
    
  4. 运行 docker image ls 命令,查看刚转换成功的镜像

     $ docker image ls
     REPOSITORY                                                    TAG              IMAGE ID       CREATED         SIZE
     mysql-test                                                    latest           05cb947f5572   5 seconds ago   209MB
    

从功能上讲,docker export相当于commit +save,先将容器commit成镜像,再save成文件。

下篇内容:境变量、数据卷等。期待您和小九一起继续学习~

本文由Websoft9原创发布,转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容