参考菜鸟教程中的docker教程 :https://www.runoob.com/docker/docker-tutorial.html
Docker是:一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。
目的:让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
机制:容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),容器性能开销极低。
历史:Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。
借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
yum install docker-ce
启动 Docker:systemctl start docker
下载docker desktop,
https://hub.docker.com/editions/community/docker-ce-desktop-windows
运行文件安装docker,打开软件后警告WSL 2installation is incomplete,根据网页下载文件并运行,重启系统即可
控制面板 程序功能 启用或关闭windows功能,确认勾选Hyper-V
win10没有Hyper-v的解决方法
windows Docker容器和镜像文件安装位置更改
参考 windows docker 更改镜像安装目录
docker 客户端非常简单 ,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command --help
更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
docker stats --help
docker run hello-world
各个参数解析:
docker: Docker 的二进制执行文件。
run: 与前面的 docker 组合来运行一个容器。
我们可以使用 docker images
来列出本地主机上的镜像。
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
docker run -t -i ubuntu:15.10 /bin/bash
如果不指定一个镜像的版本标签,例如只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。
如果我们想预先下载这个镜像,我们可以使用 docker pull
命令来下载它。
docker pull ubuntu:13.10
可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
我们也可以使用 docker search
命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。
docker search httpd
参数:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull
来下载镜像
docker pull httpd
下载完成后,我们就可以使用这个镜像了。
docker run httpd
镜像删除使用 docker rmi
命令,比如我们删除 hello-world 镜像:
docker rmi hello-world
删除/var/lib/docker/image/overlay2/imagedb/content/sha256目录下相应的镜像文件即可
docker run -it image_id /bin/bash
各个参数解析:
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
通过运行 exit 命令或者使用 CTRL+D 来退出容器。
在大部分的场景下,我们希望 docker 的服务是在后台运行的,可以过 -d 指定容器的运行模式。
使用以下命令创建一个以进程方式运行的容器
docker run -d image_id /bin/sh -c "while true; do echo hello world; sleep 1; done"
返回:长字符串叫做容器 ID,对每个容器来说都是唯一的, 可以通过容器 ID 来查看对应的容器发生了什么
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
docker attach
,如果从这个容器退出,会导致容器的停止。docker exec
:推荐大家使用 docker exec
命令,因为此退出容器终端,不会导致容器的停止。如:docker exec -it container_id /bin/bash
docker ps
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
NAMES: 自动分配的容器名称。
查看容器内的标准输出:
docker logs CONTAINER_ID
返回:
hello world
查看所有容器
docker ps -a
停止一个容器:docker stop <容器 ID>
docker stop CONTAINER_ID
停止的容器可以通过 docker restart
重启:
docker restart <容器 ID>
导出本地某个容器:docker export
:
docker export contain_id > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
使用 docker import
从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
docker rm -f 1e560fca3906
使用 docker 构建一个 web 应用程序。
docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口随机映射到我们使用的主机上
使用 docker ps 来查看我们正在运行的容器,发现多了端口信息.也可以通过 -p 参数来设置不一样的端口:
docker run -d -p 5000:5000 training/webapp python app.py
使用 docker port
可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
docker port 容器id #或者docker port 容器名字
docker logs [ID或者名字]
可以查看容器内部的标准输出。
docker logs -f ID
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
我们还可以使用 docker top
来查看容器内部运行的进程
docker top 容器名字
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect 名字
docker stop 名字
已经停止的容器,我们可以使用命令 docker start 来启动。
docker start 名字
docker ps -l
查询最后一次创建的容器:
返回类似:
CONTAINER ID IMAGE PORTS NAMES
bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar
正在运行的容器,我们可以使用 docker restart
命令来重启。
使用 docker rm
命令来删除不需要的容器
docker rm 名字
删除容器时,容器必须是停止状态,否则会报如下错误
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -t -i ubuntu:15.10 /bin/bash
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
我们可以使用 docker images
命令来查看我们的新镜像 runoob/ubuntu:v2,使用我们的新镜像 runoob/ubuntu 来启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash
使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
创建文件夹,mkdir ***
创建Docke1rfile文件
cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -t runoob/centos:6.7 .
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
vi /etc/docker/daemon.json
添加
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],