Docker怎么工作的

docker安装成功:
ubuntu@VM-0-2-ubuntu:~$ sudo docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
DockerFile
1.层:是应用于Docker镜像的一项修改,它是用Dockerfile中一个指令来表示的。通常,一个基础镜像产生变化时就会创建一个层。当Docker构建镜像时,每一层都会堆叠在下一层之上并通过union文件系统合并成单个层。这些层都是使用sha256哈希值来唯一区分的。当Docker扫描基础镜像时,它会扫描构成该镜像的所有层ID,并且开始下载这些层。如果一个层存在于本地缓存中,则会跳过该缓存镜像的下载。
2.Docker镜像;只读模板,非常类似于将系统设置为预期状态的一段shell脚本。Docker镜像始于基础镜像,即操作系统的基础镜像Ubuntu。Docker镜像是使用Dockerfile中被称为指令的一系列命令来创建的。我们可以从相关的Dockerfile中构建自己的镜像,然后所构建的镜像会被发布到注册服务器。简单的,可以将Docker镜像看成包含运行一个应用程序的所有内容的最终可执行包即可,包括源代码、所需要的库以及所有依赖项。
3.Docker容器:当一个Docker镜像在宿主计算机中运行时,它会产生一个具有专用命名空间的进程,这就是所谓的Docker容器。Docker镜像和Docker容器之间的主要区别在于是否存在被称为容器层的一个浅薄的读/写层。
4.Docker卷:将来自Docker宿主机的数据挂载到一个容器中,卷、绑定挂载以及tmpfs卷。
5.Docker注册服务器:存储Docker镜像的地方,常见的Docker注册服务器Docker Hub,Google Container Registry ,AWS, JFrog Arifactory
6.Dockerfile就是一组指令, 构建镜像的自动化方法:FROM ubuntu \Run mkdir /tmp/logs \Run apt-get install vim \ Run apt-get install htop
7.Docker引擎:Docker引擎就是一组应用程序,提供了平台、运行时,以及用于构建和管理Docker镜像、Docker容器等的工具,Docker daemon,Docker CLI ,Docker API.Docker守护进程主要是监听创建和管理Docker对象(容器、网络和卷)的API请求,Docker CLI 提供了与Docker 守护进程交互的操作,Docker API 与Docker 引擎交互,。
8.Docker Compose: 用于定义和运行多容器应用程序的工具
9.Docker Machine: 用于在多个虚拟主机上安装Docker引擎并管理这些主机。
Docker命令
镜像标签:Using default tag: latest . ##没有tag时就用最新的标签,添加一个标签是docker pull nginx: 1.12-alpine-perl
从内部artifactory拉去镜像:docker pull docker-private.registry:1337/nginx
身份验证:docker login docker-private.registry:1337
docker run -p 80:80 nginx , 标签-p后的第一个参数80是宿主机开放给Docker的端口,第二个参数80是容器内部的端口。但是为什么sudo docker run -p 80:80 nginx 执行后没有反应呢?而且curl http://localhost:8080 返回curl: (7) Failed to connect to localhost port 8080: Connection refused?
docker ps 列出运行中的所有容器
docker stop 停止容器, docker kill 强制停止并且杀掉该容器进程
docker rm 删除容器
如何写一个dockerfile打包镜像
构建上下文就是需要被打包到镜像中的依赖文件,dockerignore类似于gitignore一样可以排除一些不必要的文件
dockerfile文件的文件名也得是dockerfile后类似于make运行makefile一样直接执行docker build就行
docker tag image_id tag_name ,例docker tag 2fe232cf4e53ubuntu:hello-world , 类似于给版本打标签;可以跟docker build 汇成一条命令docker builid -t ubuntu:hello-world . ,直接构建打包
Dockerfile指令
From :告知docker引擎从哪个基础镜像用于后续的指令
WORKDIR: 设置当前工作目录
ADD/COPY: 允许文件从宿主机到容器的文件系统,eg: ADD a.txt /usr/share/app, COPY a.txt /usr/share/app, ADD/COPY --chown=:
RUN:每一个RUN命令都会创建一个层,--no-cache 让之前RUN后的缓存无效
CMD和ENTRYPOINT:

FROM ubuntu:latest RUN apt-get update && \ apt-get update && \ apt-get install -y curl && \ rm -rf /var/lib/apt/lists/* CMD curl docker build之后需要这样执行命令docker run ubuntu:curl curl -s wttr.in,这样每次运行镜像都要传入一次参数curl,所以用到了ENTRYPOINT来改写dockerfile文件 FROM ubuntu:latest RUN apt-get update && \ apt-get update && \ apt-get install -y curl && \ rm -rf /var/lib/apt/lists/* ENTRYPOINT ["curl","-s"] 这样就不需要每次传入curl文件了,docker run ubuntu:curl wttr.in

ENV设置镜像环境变量,ENV LOGS_DIR="/var/log",可以通过-e来修改运行时容器定义的环境变量, docker run -it -e LOGS_DIR="/logs" ubuntu:env-example
VOLUME:在宿主机上创建一个目录, 并挂载到该指令中所指定的路径 VOLUME/var/logs/nginx
Docker网络
【Docker怎么工作的】

    推荐阅读