[2] 一篇文章带你入门Docker

在这里插入图片描述
大多数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容器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章