Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
说白了就是一个开销更低,安装更便捷的虚拟机。
这里介绍一点简单的Docker使用教程,详细教程参考菜鸟教程
Docker 基本语法
安装 Docker
Ubuntu
下使用命令:
1 |
|
下载镜像
1 |
|
Docker 官方提供了Docker Hub仓库,所有用户都可以向Docker Hub贡献自己制作的Docker镜像。
创建容器
1 |
|
-i
在新容器内指定一个伪终端或终端。-t
允许你对容器内的标准输入 (STDIN) 进行交互。-p
进行端口映射。90:80
指的是将主机的90
端口映射到容器的80
端口。ubuntu:20.04
镜像名:标签,这里调用20.04版本的ubuntu系统,如果本地上没有相关镜像会自动从Docker Hub上下载。/bin/bash
:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
运行完成以后,直接进入了Docker容器,这里基本上可以把它当成一个真实的ubuntu机进行使用。输入exit
退出容器,退出时容器关闭。
如果希望建立一个后台运行的Docker容器的话,可以采用。
1 |
|
-d
指的是进行后台运行。
开启/关闭 容器
1 |
|
输出详情介绍:CONTAINER ID
: 容器 ID。IMAGE
: 使用的镜像。COMMAND
: 启动容器时运行的命令。CREATED
: 容器的创建时间。STATUS
: 容器状态。PORTS
: 容器的端口信息和使用的连接类型(tcp\udp)。NAMES
: 自动分配的容器名称。
主机连接Docker
使用exit
退出后,Docker默认会关闭掉,使用docker start
重启容器但是并没有进入容器,此时可以用docker attach
或者docker exec
命令来进行连接。
1 |
|
这个命令有个缺点,使用exit
退出后容器不会在后台运行,而是跟原来一样被关闭,而docker exec
不会有这个问题。
1 |
|
导出/导入容器
1 |
|
这里将整个容器导出成ubuntu.tar
这个包,就可以进行转移。
1 |
|
这里将ubuntu.tar
导入成镜像,镜像名叫test/ubuntu
,标签为v1
删除容器
1 |
|
正在运行的容器必须先停下再删除
Docker镜像
列出本地主机上的镜像。
1
docker images
REPOSITORY
:表示镜像的仓库源TAG
:镜像的标签IMAGE ID
:镜像IDCREATED
:镜像创建时间SIZE
:镜像大小查找镜像
1
docker search httpd
获取镜像
1
docker pull centos/httpd-24-centos7
删除镜像
1
2docker rmi +镜像名字:标签
或者 docker rmi 镜像id
创建镜像
- 1.从已经创建的容器中更新镜像,并且提交这个镜像。各个参数说明:
1
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
-m
: 提交的描述信息-a
: 指定镜像作者e218edb10161
:容器 ID1275178869/ubuntu:v2
: 指定要创建的目标镜像名
- 2.使用 Dockerfile 指令来创建一个新的镜像。
1 |
|
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
1 |
|
不要忘了该命令的最后一个.
,这里指的是Dockerfile所在的路径,.
表示Dockerfile就在当前路径下。
查看一下镜像:
多了一个镜像,就是刚才创建的镜像。
具体Dockerfile的编写后面会有介绍,这里就不赘叙了。
设置镜像标签
1 |
|
Docker之Dockerfile
说白了,Dockerfile就是告诉Docker调用哪个镜像,执行哪些命令,执行完之后将容器导出为镜像。
Dockerfile的编写主要是各种指令的调用,堆在一起就好了。
FROM 和 RUN 指令
FROM
:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN
:用于执行后面跟着的命令行命令。
举个栗子
1 |
|
文件名必须是Dockerfile
一点都不能错,内容就是这两行内容。
然后执行
1 |
|
注意千万别忘了最后那个点!
查看一下镜像,发现多了一个镜像叫nginx
尝试着运行一下
1 |
|
在这里将主机的900端口映射到容器的80端口,因为访问网页服务器都是默认在80端口。
然后访问一波:
Successful!
COPY指令
复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
这个命令最强大的作用是可以将主机的文件拷贝到容器中,不然需要建共享文件夹等很麻烦的操作。
1 |
|
将file
目录以及其下的子目录全部拷贝到容器的/tmp
文件夹中,接下去对文件的操作写在RUN指令中即可。
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD
在docker run 时运行。RUN
是在 docker build。
1 |
|
1 |
|
在run容器的时候开启Apache2
服务。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
所以如果需要执行的命令比较多的话可以写一个sh脚本,直接在CMD里运行这个脚本即可。
EXPOSE
仅仅只是声明端口。
作用:
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
1 |
|
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
一个具体的示例
1 |
|