Docker 教程
Docker 基本概念
-
镜像(Image):Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
-
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
-
仓库(Repository):仓库(Repository)类似Git的远程仓库,集中存放镜像文件。
Docker 服务命令
docker version | 查看Docker版本信息 |
docker -v | 查看docker简要信息 |
systemctl start docker | 启动Docker |
systemctl stop docker | 关闭docker |
systemctl enable docker | 设置开机启动 |
service docker restart | 重启docker服务 |
service docker stop | 关闭docker服务 |
Docker 镜像命令
Docker Hub等镜像仓库上有大量的高质量的镜像可以用,可以从仓库获取镜像
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
docker search *** | 查找镜像 |
docker pull *** | 获取镜像 |
docker images / docker image ls | 显示所有镜像 |
docker rmi <镜像ID>镜像ID> | 删除镜像 |
docker commit -m=”*” -a=”aa” e218e aa/ubuntu:v2 | 提交e218e这个容器为 aa 作者的镜像 |
Docker 容器命令
docker run -dit ubuntu /bin/bash | 以后台,交互,终端方式使用镜像启动容器。 |
docker ps -a | 显示所有容器 |
docker container ls -a | 显示所有容器, -a 显示所有容器 |
docker start ** | 启动一个已停止的容器 |
docker stop/restart *** | 停止/重启容器 |
docker rm -f ***/删除容器,-f 可以删除运行中的容器 | |
docker attach 243c | 进入243c容器,退出关闭容器 |
docker exec -i 69d1 bash | 交互式进入69d1容器,退出不关闭 |
docker export *** > ubunt.tar | 导出容器***为ubuntu.tar |
docker import - test/ubuntu:v1 | 将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1 |
docker port *** | 查看容器的端口 |
docker logs -f *** | 查看容器的内部标准输出 |
docker top *** | 查看容器进程 |
Docker run 命令
-d | 后台运行容器并返回容器ID |
-i | 以交互模式运行容器,通常与 -t 同时使用; |
-P | 随机端口映射,容器内部端口随机映射到主机的端口 |
-p | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与 -i 同时使用; |
--name=”nginx-lb” | 为容器指定一个名称; |
--dns 8.8.8.8 | 指定容器使用的DNS服务器,默认和宿主一致; |
--dns-search example.com | 指定容器DNS搜索域名,默认和宿主一致; |
-h “mars” | 指定容器的hostname; |
-e username=”ritchie” | 设置环境变量; |
--env-file=[] | 从指定文件读入环境变量; |
--cpuset=”0-2” or --cpuset=”0,1,2” | 绑定容器到指定CPU运行; |
-m | 设置容器使用内存最大值; |
--net=”bridge” | 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; |
--link=[] | 添加链接到另一个容器; |
--expose=[] | 开放一个端口或一组端口; |
--volume , -v | 绑定一个卷 |
Docker run 实例
-
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
-
使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
-
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
-
绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
-
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
runoob@runoob:~$ docker run -it nginx:latest /bin/bash root@b8573233d675:/#
使用 Dockerfile 定制镜像
-
FROM 指定基础镜像
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像
-
RUN 执行命令
-
shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。命令>
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
-
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”]
FROM debian:stretch RUN set -x; buildDeps='gcc libc6-dev make wget' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ && rm -rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm -r /usr/src/redis \ && apt-get purge -y --auto-remove $buildDeps
-
构建镜像
在 Dockerfile 文件所在目录执行
docker build -t nginx:v3 .
-
镜像构建上下文(Context)
. 表示当前目录,而 Dockerfile 就在当前目录,当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢
这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径,docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样 Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
-