大多数Docker入门相关文章都是从一串命令输出一个“Hello World”开始的。本文则是按照Docker镜像、Docker容器再到“Hello World”进行循序渐进的讲解。阅读本文者需要对Linux命令很熟悉,还需要明白镜像、仓库、容器三大概念。
1. 镜像操作入门
1.1 概念
镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。镜像是容器在本地运行的基础,Dokcer运行容器前需要本地存在对应的镜像,如果不存在对应的镜像,Docker 会先从默认的镜像仓库下载(如果用户不希望Docker从默认的镜像仓库下载镜像的话,可以使用自定义镜像仓库)。下面将从拉取镜像,列出镜像,删除镜像,搜索镜像这三方面进行镜像相关知识点的讲解。
1.2 拉取镜像
拉取镜像指的是从Docker远程仓库直接拉取镜像到本地。需要注意的是,在国内访问Docker Hub巨慢,需要配置镜像加速,推荐使用阿里云进行加速,具体办法可以百度。
拉取镜像用到的命令:
docker pull 镜像名:标签名
这里的标签名常常省略,如果省略,默认为:
docker pull 镜像名:latest
接下来试一下拉取最新的ubuntu镜像
1.3 列出本地镜像
支持使用以下两个命令来列出本机已有镜像:
docker image ls
或
docker images
接下来试一下这两个命令:
字段解释:
- REPOSITORY:镜像所在仓库名称
- TAG:标签名
- IMAGE ID :镜像ID
- CREATED :创建时间
- SIZE:镜像大小
加上-q属性,则只列出镜像ID
1.4 删除镜像
支持使用以下两个命令执行删除镜像操作:
docker rmi 镜像id/镜像名:标签名
或
docker image rm 镜像id/镜像名:标签名
同样的,标签名如果省略的话,默认为latest
前面我们使用docker images -q/docker image ls -q列出了所有镜像ID,我们可以将这个命令和docker rmi命令结合,用来删除所有镜像:
docker rmi `docker images -q`
已经全部删除了
1.5 搜索镜像
如果你需要从远程仓库中查找需要的镜像,可以通过以下命令搜索:
docker search 关键字
如搜索centos:
字段解释:
- NAME:名字
- DESCRIPTION:描述
- STARS:受欢迎程序
- OFFICIAL:是否是官方版
- AUTOMATED:是否是由Docker Hub自动构建流程构建的
扩展命令:
[1] 列出受欢迎程度大于1000的镜像:
docker search -s 1000 centos
[2] 显示描述详情
docker search --no-trunc centos
1.6. 小结
对镜像的操作主要涉及到镜像的增、删、查,所涉及到的命令可以简单概括为下表:
命令 | 描述 |
---|---|
docker pull | 拉取镜像 |
docker images | 列出本地镜像 |
docker rmi | 删除镜像 |
docker search | 搜索镜像 |
2. 容器操作入门
2.1 查看容器
2.1.1 查看正在运行的容器
docker ps [OPTIONS]
查看正在运行的容器
docker ps
如下图:
- CONTAINER ID:容器ID
- IMAGE:所使用的镜像
- COMMAND:容器启动后运行的第一条命令
- CREATED:创建时间
- STATUS:容器运行状态
- PORTS:表示端口映射关系0.0.0.0:8888->8080/tcp表示将容器内部的8080端口映射到本机的8888端口上,采用docker run -p 宿主机端口:容器内部端口创建出来的容器能看到此项
- NAMES:名称
2.2.1 查看所有容器
docker ps -a
如下图,可以看到Up(正在运行状态的容器),也可以看到Exited(停止状态的容器):
列出所有的容器ID
docker ps -a -q
常用这句命令和其他命令结合做批量操作。比如批量启动所有容器、批量停止所有容器、批量删除所有容器,这些到后面都会讲。
2.2 创建、启动、退出容器
命令:
docker run [OPTIONS] 镜像名:标签名
OPTIONS可选值:
- -i 允许与容器内的标准输入进行交互,同时交互式运行容器。
- -t 指定一个伪终端,-i和-t常常配合起来使用。
- –name(前面有2个-),为容器指定一个名称,不手动指定的话,Docker将会自动指定。
- -d 创建一个守护式容器在后台运行,并返回容器ID,单独的-d命令并不会启动容器,可以和-t一起使用,从而创建并启动一个守护进程。
- -p 端口映射,将容器内部的端口映射到宿主机某一端口上。格式为:-p 宿主机端口:容器内部端口。比如将容器内部的8080端口映射到宿主机的8081端口上,则可以使用命令:-p 8081:8080。
- -v 目录映射,将宿主机上的目录映射到容器内部。格式为:宿主机目录:容器内部目录。
上面写的OPTIONS的属性值大家先理解着看一下就行,后面我们一步一步根据实际场景来使用这些参数。
2.2.1 创建一个容器
docker run 镜像名:标签名
注意:这条命令只是创建出一个容器出来,容器并没有运行。
可以用docker ps -a命令看到该容器的运行状态
由于没有指定–name属性,Docker为我们指定了一个不重复的名字
也可以手动指定一个名字
使用这个命令打印出Hello World出来
docker run ubuntu /bin/echo "Hello World"
上面这句话的意思是创建一个容器,并调用容器内部的echo命令打印出"Hello World",命令运行完之后容器立刻变为Exited状态。
2.2.2 创建一个可交互的容器
命令:
docker run -it 镜像名:标签名 /bin/bash
交互运行ubuntu:
- -i 开启标准输入交互
- -t 在容器内部指定一个伪终端
此时使用docker ps命令可以看到容器是在运行的状态
接下来再次使用上面的命令创建一个可交互的容器,然后使用docker ps命令查看
可以得出结论:同一镜像支持创建多个容器,并支持多个容器同时运行。
2.2.3 退出容器
在容器内部使用命令:
exit
直接退出
容器状态也变为Exited状态
如果不想直接退出容器,而是将容器放到后台运行,则使用快捷键ctrl + p + q
用ps命令可看到容器依然在运行
2.3 启动已运行过的容器
docker start 容器ID/容器名称
示例:
需要明确的是用docker start命令启动的容器是在后台运行的。
2.4 登陆已启动的容器
exec -it 容器ID/容器名 /bin/bash
登陆已启动的容器
需要注意的是, 当使用docker exec命令进入容器后,使用exit命令并不会使容器结束运行。 在这种情况下使用exit退出可交互命令行后,容器依然运行在后台。
2.5 守护式容器的创建启动
如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
docker run -id --name=自定义容器名 镜像名:标签名
- -i:运行容器
- -d:设置为守护进程
- –name非必须,只是为了好区分
以守护进程的方式创建一个myUbuntu容器,并运行
2.6 停止正在运行的容器
docker stop 容器ID/容器名
把刚刚在后台运行的容器停止
停止运行的全部容器
docker stop `docker ps -a -q`
其实和上面讲的删除的批量操作是一样的,把docker ps -a -q命令的结果传给docker stop命令进行批量操作。
支持使用docker kill命令强制停止:
docker kill 容器ID/容器名
能用docker stop停止的,就用docker stop命令。如果
2.7 删除容器
删除单个
docker rm 容器名称/容器ID
删除全部
docker rm `docker ps -a -q`
注意:只支持删除停止状态下的容器,正在运行的容器不支持删除。
2.8 端口映射
需求,在容器内部部署了一个网络服务器,要求能在容器外部访问到这个服务器。
常用场景:
- 访问容器内的Tomcat服务器
- 访问容器内的MySQL服务器
命令:
docker run -p 宿主机端口:容器内部端口 xxx
将Tomcat容器的8080端口映射到本机的8082端口
docker run -i -p 8082:8080 tomcat(如果之前没有pull过tomcat镜像,则运行这条命令会先pull tomcat镜像到本地仓库)
如下图:
在浏览器访问一下:
可以看到Tomcat实际已经起来了,只不过没有找到任何资源。
这是因为tomcat容器下的webapps目录默认是空的:
注:tomcat镜像实际上是已经配置好jdk+tomcat的Linux环境。
2.8 目录/文件映射
docker run -v 宿主机目录:docker容器内部目录 xxx
实战演示:
创建目录myapp
mkdir myapp
进入新创建的目录
cd myapp
创建文件index.html
touch index.html
写入以下内容
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
将本机的myapp目录映射到tomcat的webapps目录下,并启动tomcat
docker run -v $PWD:/usr/local/tomcat/webapps/myapp/ -p 8082:8080 tomcat
成功运行
访问地址 http://localhost:8082/myapp/index.html
可以看到成功映射了
2.9 目录文件只读映射
docker run -v 宿主机目录:docker容器内部目录:ro xxx
还是以tomcat容器为例
docker run -v $PWD:/usr/local/tomcat/webapps/myapp/:ro -it tomcat /bin/bash
提示为只读文件系统
2.10 拷贝宿主机文件到容器
docker cp 要拷贝的文件或目录 容器ID或容器名称:要拷贝到的容器内部位置
实战演示:
新创建文件123.txt
echo abcdef > 123.txt
拷贝文件到之前创建的ubuntu容器内部
docker cp 123.txt 58b747c15d93:/home/
可以看到成功拷贝
2.11 拷贝容器内的文件到宿主机
docker cp 容器ID或容器名称:要拷贝到的容器内部位置 要拷贝的文件或目录
如2.10节的逆操作是
docker cp 58b747c15d93:/home/123.txt ./123.txt
2.12 查看容器内部细节
docker inspect 容器ID/容器名称
关于Docker入门的讲解就到这里了,下一节将和大家一起实战部署应用到Docker容器。