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
浙公网安备 33010602011771号