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语言程序:
[vagrant@docker-host ~]$ mkdir baseimg && cd baseimg && vim base.c
#include<stdio.h>
int main(void)
{
printf("hello world");
return 0;
}
2、编译刚才写的程序,得到一个简单的二进制文件:
[vagrant@docker-host baseimg]$ gcc -static base.c -o base
3、编写 Dockerfile:
[vagrant@docker-host baseimg]$ vim Dockerfile
# start
FROM scratch
ADD base /
CMD ["/base"]
# end
4、构建 baseimage:
[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、查看并运行镜像:
[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/
[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 下来:
[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 负责运行。
创建容器:
[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 服务器可以使网站文件和程序通过浏览器来访问,操作之前建议关闭系统的防火墙:
[root@localhost ~]# systemctl stop firewalld.service # 关闭防火墙
[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
一个镜像:
[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] | 退出后再次进入 |
正在运行的容器的数量:
docker ps -q | wc -l
监控容器数量:
docker ps -a -q | wc -l
删除掉状态为exited
的容器
docker rm $(docker ps -a | grep Exited | awk '{print $1}')
Done.