Docker的基础使用:镜像、容器
一、Docker的架构
1.Docker平台
- Docker提供了一个开发、打包、运行Application(应用)的平台。
- Docker把应用和底层物理资源隔离开来
** 其中Docker Engine是Docker中非常重要的一个部件**
2.Docker Engine
- Docker是一个C/S架构,有server和client。
- Docker Engine包含:一个后台进程(dockerd)、REST API Server(负责server和client通信)、CLI接口(docker)
3.Docker架构
二、Docker Image(镜像)
1.什么是Image?
- 文件和meta data的集合
- Image是分层的,并且每一层都可以添加改变删除文件(软件),成为一个新的image
- 不同的image可以共享相同的layer
- Image本身是read-only的
2.获取镜像
(1)Dockerfile
Docker提供了一种文件格式Dockerfile,通过这种格式的文件我们就可以定义一个Docker镜像,通过这个文件,我们就可以构建(build)出一个镜像。
一个简单的Dockerfile示例:
FROM ubuntu:14.04 -- 指定Base Image
LABEL maintainer="hellozhaoxudong@163.com" -- 标识
RUN apt-get update && apt-get install -y redis-server -- 在Base Image之上运行apt-get update和apt-get install redis-server两条命令
EXPOSE 6379 -- 暴露端口
ENTRYPOINT ["/usr/bin/redis-server"] -- 启动redis-server
(2)从Registry(仓库)拉取
我们可以从远程仓库拉取我们需要的镜像,同时,我们也可以将我们自己的镜像推送到远程仓库上去。
示例:从Docker Hub拉取一个ubuntu 14.04的基础镜像:
执行命令:docker pull ubuntu:14.04
3.Docker Hub
目前Docker官方维护了一个远程仓库(Docker Hub),上面有一些官方维护的镜像,我们可以从这个仓库拉取所需要的镜像。
4.查看本地镜像
执行命令: docker image ls
可以看到展示了我们刚刚拉取的ubuntu镜像。
可以看到ubuntu镜像仅仅197MB,和我们自己本机装一个虚拟机的大小差距很大,这是因为镜像是不包含Linux Kernel的,精简了很多核心系统文件,所以体积非常小。
三、通过Dockerfile构建一个Base Image(基础镜像)
1.编写能够打印hello docker的c代码
#include<stdio.h>
int main()
{
printf("hello docker!\n");
}
2.编译并测试
4.创建Dockerfile
FROM scratch -- 不基于基础镜像
ADD hello_docker.exe / -- 将我们生成的可执行文件加到镜像的根目录下
cmd ["/hello_docker.exe"] -- 执行/hello_docker命令
5.构建镜像
docker build -t hello_docker_20200301 .
// -t表示给该镜像起一个标签(tag),.表示在当前目录寻找Dockfile
查看一下刚刚构建的镜像
6.运行镜像
docker run hello_docker_20200301
四、Container(容器)
1.什么是Container?
- Container是通过Image创建的。
- 在镜像层(Image layer)之上建立一个容器层(Container layer),Container layer是可读可写的,为在镜像之上安装其他软件提供空间。
- 镜像可以看做面向对象中的类,容器可以看做这个类实例化的一个对象。
- Image负责Application的存储和分发,Container负责Application的运行。
2.最简单的通过镜像创建容器的方法
通过docker run命令,:后面可以指定TAG,默认是latest,例如本地有多个ubuntu版本镜像时,需要指定一下TAG
查看容器
docker container ls -a
但是这个容器创建完后就退出了。
3.交互式创建容器的方法
docker run -it ubuntu:14.04
运行以上命令发现我们进入了ubuntu里面。
再开一个终端看一下容器情况:
发现ubuntu:14.04这个镜像创建的容器正在运行
4.退出容器
退出容器:
退出后再使用docker container ls查询会发现刚刚这个容易已经停止了。
五、关于镜像和容器的其他命令
1.关于容器的其他命令
- 删除容器:
docker container rm 容器ID
2.命令简写:
- 查看所有的容器
docker container ls -a = docker ps -a
- 删除容器
docker container rm 容器ID = docker rm 容器ID
- 查看所有的镜像
docker image ls = docker images
- 删除镜像
docker image rm 镜像ID = docker rmi 镜像ID
3.批量删除容器
- 删除所有的容器
docker container ls -aq //加-q参数可只显示第一列,即只显示容器ID
docker container rm ${docker container ls -aq} //这样就能删除所有的容器
- 删除所有已退出的容器
docker container ls -f "status=exited" -q //加-f参数按照接下来的字符串查询; 加-q参数可只显示第一列,即只显示容器ID
docker container rm ${docker container ls -f "status=exited" -q} //这样就能删除所有已退出的容器