Docker - Container & Image

Docker - 核心概念:

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

Docker - 镜像[Image]:

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构(layer),由一系列指令一步一步构建出来,不同image 之间可以共享 layer ,Image本身是只读的(read-only)。

构建Base Image:

通过简单的 Dockerfile 来构建一个 baseimage:

1、编写一个简单的 C语言程序:

1
2
3
4
5
6
7
8
[vagrant@docker-host ~]$ mkdir baseimg && cd baseimg && vim base.c

#include<stdio.h>
int main(void)
{
printf("hello world");
return 0;
}

2、编译刚才写的程序,得到一个简单的二进制文件:

1
[vagrant@docker-host baseimg]$ gcc -static base.c  -o base

3、编写 Dockerfile:

1
2
3
4
5
6
[vagrant@docker-host baseimg]$ vim Dockerfile
# start
FROM scratch
ADD base /
CMD ["/base"]
# end

4、构建 baseimage:

1
2
3
4
5
6
7
8
9
10
11
12
[vagrant@docker-host baseimg]$ docker build -t zhangyangdev/baseimg .
Sending build context to Docker daemon 868.9kB
Step 1/3 : FROM scratch
--->
Step 2/3 : ADD base /
---> 985f7dd1d401
Step 3/3 : CMD ["/base"]
---> Running in b8241cf4dc5c
Removing intermediate container b8241cf4dc5c
---> f048aeb88f64
Successfully built f048aeb88f64
Successfully tagged baseimg:latest

5、查看并运行镜像:

1
2
3
4
5
[vagrant@docker-host baseimg]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhangyangdev/baseimg latest f048aeb88f64 About a minute ago 865kB
[vagrant@docker-host baseimg]$ docker run f048aeb88f64
hello world

至此,已经构建好了一个简单的 baseimage。

镜像发布:

docker hub 是一个docker提供的镜像托管网站,可以下载pull 一些官方或者非官方的镜像,同时 也可以将自己构建好的镜像push到自己的 Docker Hub 仓库中。

要发布自己制作的镜像,首先得在 Docker Hub 上进行注册激活,之后会得到一个用户名和密码,然后在控制台输入docker login进行登录,登录成功会显示Login Succeeded

Docker Hub:https://hub.docker.com/

1
2
3
4
[vagrant@docker-host baseimg]$ docker push zhangyangdev/baseimg:latest
The push refers to repository [docker.io/zhangyangdev/baseimg]
2e492296c0e4: Pushed
latest: digest: sha256:2ad65382bb199a75a40535fb0adbdbb941211c114d856efd1147eae054022393 size: 527

push 结束后,刷新 Docker Hub 的个人中心页面就可以看到push 的镜像了。

此时,可以将本地的镜像 删除掉,再从 dockhub 上 pull 下来:

1
2
3
4
5
6
7
8
[vagrant@docker-host baseimg]$ docker rm $(docker ps -aq)
[vagrant@docker-host baseimg]$ docker rmi zhangyangdev/baseimg
[vagrant@docker-host baseimg]$ docker pull zhangyangdev/baseimg
Using default tag: latest
latest: Pulling from zhangyangdev/baseimg
9c94da54d2ab: Pull complete
Digest: sha256:2ad65382bb199a75a40535fb0adbdbb941211c114d856efd1147eae054022393
Status: Downloaded newer image for zhangyangdev/baseimg:latest

Docker - 容器[Container]:

Docker - 容器概述

容器是应用程序层的一个抽象,将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为孤立进程运行。容器占用的空间少于虚拟机(容器图像的大小通常为几十MB),并且几乎立即启动。

Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像创建起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。

Container是在 Image 镜像上建立的一个 layer是可读可写的,Image 负责app 的存储和分发Container 负责运行。

创建容器:

1
2
3
4
5
6
7
[vagrant@docker-host ~]$ docker images # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
baseimg latest f048aeb88f64 9 minutes ago 865kB
hello-world latest e38bc07ac18e 8 weeks ago 1.85kB
[vagrant@docker-host ~]$ docker run hello-world # 启动容器

Hello from Docker!

示例:创建Nginx容器

我们需要安装一个Nginx 的Web服务器,Web 服务器可以使网站文件和程序通过浏览器来访问,操作之前建议关闭系统的防火墙:

1
[root@localhost ~]# systemctl stop firewalld.service # 关闭防火墙
1
2
3
4
5
6
7
[root@localhost ~]# docker search nginx    # 搜索镜像  选择OFFICIAL状态为[OK]的官方镜像
[root@localhost ~]# docker pull nginx # 下载Nginx镜像
[root@localhost ~]# docker run --name docker_nginx -d -p 80:80 nginx # 启动nginx [80:80] 主机端口:容器端口
[root@localhost ~]# docker ps # 查看运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
876b4161c793 nginx "nginx -g 'daemon ..." About a minute ago Up About a minute 0.0.0.0:80->80/tcp nervous_thompson
[root@localhost ~]# docker logs docker_nginx # 查看启动日志

运行交互式容器:

dokcer的容器是基于镜像而创建的,所以在运行交互式容器之前需要先pull一个镜像:

1
2
3
4
5
6
7
8
[vagrant@docker-host ~]$ docker pull ubuntu  # 拉取镜像
[vagrant@docker-host ~]$ docker images # 查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 113a43faa138 42 hours ago 81.2MB
[vagrant@docker-host ~]$ docker run -it ubuntu # 创建交互式容器
root@4948b39a7d56:/# cat /etc/issue # 此时会发现进入了一个 Ubuntu 系统中
Ubuntu 18.04 LTS \n \l
root@4948b39a7d56:~# exit # 此时容器的状态由Up变为Exited

Docker - 常用命令:

简单命令:

命令 简写 作用
docker container ls -aq docker ps -aq 查看退出状态的容器
docker container commit docker commit 提交对容器的操作
docker image build docker build 通过Dockerfile构建Image
docker container inspect docker inspect 用于获取容器/镜像的元数据
docker container stop docker stop 停止容器
docker container start docker start 启动容器

组合命令:

命令 作用
docker rm $(docker container ls -aq) 删除掉状态为exited的容器
dokcer rm $(dokcer container ls -f “status=exited” -q) 删除掉状态为exited的容器
docker top docker ps -q 获取docker执行进程
docker run –name dk_ubuntu -it ubuntu bash 进入Ubuntu系统
docker attach [image id / name] 退出后再次进入

正在运行的容器的数量:

1
docker ps -q | wc -l

监控容器数量:

1
docker ps -a -q | wc -l

删除掉状态为exited的容器

1
docker rm  $(docker ps -a | grep Exited | awk '{print $1}')

Done.