What is docker

  docker中的容器

    lxc --> libcontainer --> runC

 OCI

Open Container Initiative

  由Linux基金会主导于2015年6月创立

  旨在围绕容器格式和运行时指定一个开放的工业化标准

  contains two specifications

    the Runtime Specification (runtime-spec)

    the Image Specification (image-spec)

  The Runtime Specification outlines how to run a "filesystem bundle" that is unpacked on disk

  At a high - level an OCI implementation would download an OCI Image then unpack that image into an OCI Runtime filesystem bundle

runC

OCF:Open Container Format

runC is a CLI tool for spawning and running containers according to the OCI specification

  Containers are started as a child process of runC and can be embedded into various other systems without having to run a daemon

  runC is built on libcontainer,the same container technology powering millions of Docker Engine installations

docker-hub:

https://hub.docker.com

docker architecture

 docker architecture

The Docker daemon

  The Docker daemon(dockerd)listens for Docker API requests and manages Docker objects such as images,containers,networks,and volumes

The Docker client

  The Docker client(docker)is the primary way that many Docker users interact with Docker

  The docker command uses the Docker API.

Docker registries

  A Docker registry stores Docker images.

  Docker Hub and Docker Cloud are public registries that anyone can use,and Docker is configured to look for images on Docker Hub by default.

  You can even run your own private registry.

Docker objects

When you use Docker,you are creating and using images,containers,networks,volumes,plugins,and other objects.

  IMAGES

    An images is a read-only template with instructions for creating a Docker container.

    Often,an image is based on another image,with some additional customization.

    You might create your own images or you might only use those created by others and published in a registry.

  CONTAINERS

    A container is a runnable instance of an image.

    You can create,run,stop,mova,or delete a container using the Docker API or CLI

    You can connect a container to one or more networks,attach storage to it,or even create a new image based on its current state.

镜像:静态

容器:动态,生命周期

Docker Host and Registry

 

 安装及使用docker

依赖的基础环境

  64 bit CPU

  Linux Kernel 3.10+

  Linux kernel cgroups and namespaces

CentOS 7

  "Extras" repository

Docker Daemon

  systemctl start docker.service

Docker Client

  docker [OPTIONS] COMMAND [arg...]

Investigating the Docker environment

docker version

  The version option shows which versions of different Docker components are installed

docker event state

常用操作

docker search:Search the Docker Hub for images

docker pull:Pull an image or a repository from a registry

docker images:List images

docker create:Create a new container

docker start:Start one or more stopped containers

docker run:Run a command in a new container

docker attach:Attach to a running container

docker ps:List containers

docker logs:Fetch the logs of a container

docker restart:Restart a container

docker stop: Stop on or more running containers

docker kill:Kill one or more running containers

docker rm:Remove one or more containers

 

lxc:LinuX Container

  chroot,根切换;

  namespaces:名称空间

  CGroups:控制组

  简单使用:

    lxc-checkconfig:

      检查系统环境是否满足容器使用要求;

    lxc-create:创建lxc容器;

      lxc-create -n NAME -t TEMPLATE_NAME

    lxc-start:启动容器;

      lxc-start -n NAME -d

      Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

    lxc-info:查看容器相关的信息;

      lxc-info -n NAME

    lxc-console:附加至指定容器的控制台;

      lxc-console -n NAME -t NUMBER

    lxc-stop:停止容器;

    lxc-destory:删除处于停机状态的容器;

    lxc-snapshot:创建和恢复快照;

Docker安装方法:

  docker双发行版:

    docker-ee

    docker-ce

      moby

  1、CentOS Extras Repo

  2、Docker-CE

  下载:https://download.docker.com/

    仓库配置文件:https://download.docker.com/linux/centos/docker-ce.repo

Docker组件:

  docker程序环境:

    环境配置文件:

      /etc/sysconfig/docker-network

      /etc/sysconfig/docker-storage

      /etc/sysconfig/docker

    Unit File:

      /usr/lib/systemd/system/docker.service

    Docker Registry配置文件:

      /etc/containers/registries.conf

    docker-ce:

      配置文件:/etc/docker/daemon.json

Docker镜像加速

  docker cn

  阿里云加速器

  中国科技大学
  {

    "registry-mirrors": ["https://registry.docker-cn.com"]

  }

注册阿里云账号,专用加速器地址获得路径:

  https://cr.console.aliyun.com/#/accelerator

 物理:

  Client <--> Daemon <--> Registry Server

逻辑:

  Containers:容器

  Images:镜像、映像

  Registry:Image Repositories

容器的状态:

  created:

  runing:

  paused:

  stopped:

  deleted:

docker

  images

  pull

  run

  ps

查看docker相关的信息:

  version

  info

镜像:

  images

  rmi

  pull

容器:

  run:创建并运行一个容器;

  create:创建一个容器;

start:启动一个处于停止状态容器;

创建:

  create

  run

启动:

  start

停止:

  kill

  stop

重启:

  restart

暂停和继续:

  pause
  unpause

删除容器:

  rm

  run --rm

创建容器:

  基于“镜像文件”,

    镜像文件有默认要运行的程序;

  注意:

    运行的容器内部必须有一个工作前台的运行的进程;

    docker的容器的通常也是仅为运行一个程序;

      要想在容器内运行多个程序,一般需要提供一个管控程序,例如supervised。
  run, create

    --name CT_NAME

    --rm:容器运行终止即自行删除

    --network BRIDGE:让容器加入的网络;

      默认为docker0;

    交互式启动一个容器:

      -i:--interactive,交互式;

      -t:Allocate a pseudo-TTY

      从终端拆除:ctrl+p, ctrl+q

attach:附加至某运行状态的容器的终端设备;

exec:让运行中的容器运行一个额外的程序;

查看:

  logs:Fetch the logs of a container,容器内部程序运行时输出到终端的信息;

  ps:List containers

    -a, --all:列出所有容器;

    --filter, -f:过滤器条件显示

      name=

      status={stopped|running|paused}

  stats:动态方式显示容器的资源占用状态:

  top:Display the running processes of a container

 

实验环境:

node1:

主机名:node1.smoke.com

操作系统:centos 7.5

内核版本:3.10.0-862.el7.x86_64

网卡1:vmnet0 172.16.100.67

网卡2:vmnet8 dhcp client

node2:

主机名:node2.smoke.com

操作系统:centos 7.5

内核版本:3.10.0-862.el7.x86_64

网卡1:vmnet0 172.16.100.68

网卡2:vmnet8 dhcp client

node3:

主机名:node3.smoke.com

操作系统:centos 7.5

内核版本:3.10.0-862.el7.x86_64

网卡1:vmnet0 172.16.100.69

网卡2:vmnet8 dhcp client

 

node1:

[root@node1 ~]# cd /etc/yum.repos.d/
[root@node1 yum.repos.d]# mkdir OldMirrorFile
[root@node1 yum.repos.d]# mv CentOS-* OldMirrorFile/
[root@node1 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@node1 yum.repos.d]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@node1 yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2

下载docker-ce的yum源报错如下:

[root@node1 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
Could not fetch/save url https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to file /etc/yum.repos.d/docker-ce.repo: [Errno 14]
 curl#60 - "Peer's Certificate has expired."

由于系统时间问题导致:

[root@node1 yum.repos.d]# hwclock -s
[root@node1 yum.repos.d]# date
[root@node1 yum.repos.d]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@node1 yum.repos.d]# yum repolist
[root@node1 yum.repos.d]# yum list docker-ce.x86_64 --showduplicates | sort -r
[root@node1 yum.repos.d]# yum -y install docker-ce-18.06.0.ce-3.el7

注册阿里云账号密码https://cr.console.aliyun.com,登录后点击镜像加速器,复制加速器地址(https://bhzjdbej.mirror.aliyuncs.com)

[root@node1 ~]# mkdir /etc/docker
[root@node1 ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://bhzjdbej.mirror.aliyuncs.com"]
}
[root@node1 ~]# systemctl start docker.service

docker基本用法

[root@node1 ~]# docker version
[root@node1 ~]# docker info
[root@node1 ~]# docker search nginx
[root@node1 ~]# docker image pull nginx:1.14-alpine
[root@node1 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.14-alpine         8a2fb25a19f5        11 months ago       16MB
[root@node1 ~]# docker pull busybox
[root@node1 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              83aa35aa1c79        2 weeks ago         1.22MB
nginx               1.14-alpine         8a2fb25a19f5        11 months ago       16MB
[root@node1 ~]# docker image ls --no-trunc
REPOSITORY          TAG                 IMAGE ID                                                                  CREATED             SIZE
busybox             latest              sha256:83aa35aa1c79e4b6957e018da6e322bfca92bf3b4696a211b42502543c242d6f   2 weeks ago         1.22MB
nginx               1.14-alpine         sha256:8a2fb25a19f5dc1528b7a3fabe8b3145ff57fe10e4f1edac6c718a3cf4aa4b73   11 months ago       16MB
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5204d69975e4        bridge              bridge              local
bacbdfd392ea        host                host                local
f6f034918bdd        none                null                local
[root@node1 ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:a2:c1:08:24  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@node1 ~]# docker run --name b1 -it busybox:latest
/ # ls /
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
    9 root      0:00 ps
/ # mkdir -p /data/html
/ # vi /data/html/index.html
Busybox https server.
/ # httpd -f -h /data/html/
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
948a1a4f05b2        busybox:latest      "sh"                3 minutes ago       Up 3 minutes                            b1
[root@node1 ~]# docker inspect b1
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "5204d69975e4ae844e5e1e3c091fc1fb70165e265262d01e72c24455876cf85d",
                    "EndpointID": "82abfaec513637e6b78d231ade64b8e4e2c325da3abf82b974328d0f491fb2ae",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
[root@node1 ~]# curl 172.17.0.2
Busybox https server.
/ # httpd -f -h /data/html/
^C
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   14 root      0:00 ps
/ # exit
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
948a1a4f05b2        busybox:latest      "sh"                7 minutes ago       Exited (0) About a minute ago                       b1
[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
948a1a4f05b2        busybox:latest      "sh"                8 minutes ago       Exited (0) 2 minutes ago                       b1

[root@node1 ~]# docker start -i -a b1
/ #
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
948a1a4f05b2        busybox:latest      "sh"                22 hours ago        Up 20 seconds                           b1
[root@node1 ~]# docker kill b1
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
948a1a4f05b2        busybox:latest      "sh"                22 hours ago        Exited (137) 9 seconds ago                       b1
[root@node1 ~]# docker rm b1
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@node1 ~]# docker run --name web1 -d nginx:1.14-alpine
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
728e6866b8bb        nginx:1.14-alpine   "nginx -g 'daemon of…"   9 seconds ago       Up 8 seconds        80/tcp              web1
[root@node1 ~]# docker inspect web1
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "5204d69975e4ae844e5e1e3c091fc1fb70165e265262d01e72c24455876cf85d",
                    "EndpointID": "a99febdde045ec9060958f646e666e76320dcdb1c2493dc97bc69c285f1f39d0",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
[root@node1 ~]# curl 172.17.0.2
[root@node1 ~]# docker run --name kvstor1 -d redis:4-alpine
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e163c9c2aa7e        redis:4-alpine      "docker-entrypoint.s…"   5 seconds ago       Up 3 seconds        6379/tcp            kvstor1
728e6866b8bb        nginx:1.14-alpine   "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        80/tcp              web1
[root@node1 ~]# docker exec -it kvstor1 /bin/sh
/data # ps
PID   USER     TIME  COMMAND
    1 redis     0:00 redis-server
   13 root      0:00 /bin/sh
   20 root      0:00 ps
/data # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN
tcp        0      0 :::6379                 :::*                    LISTEN
/data # redis-cli
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> exit
/data # exit
[root@node1 ~]# docker logs web1