入门篇:零基础 | 一入 Docker 深似海
入门篇,主要介绍下 Docker 的安装、常见术语、基本使用等,从零开始使用 Docker。
环境说明
- 操作系统版本:
Red Hat Enterprise Linux Server release 7.5 (Maipo)
安装
- 安装文章可参考官网:https://docs.docker.com/engine/install/centos/
- 如果已经安装过了docker,可执行如下命令进行先卸载
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- 安装
yum-utils
软件包(提供了yum-config-manager
程序)
$ sudo yum install -y yum-utils
- 配置稳定的 yum 源方便下载 Docker Engine,由于官网地址是在国外下载较慢,现进行修改为国内阿里云的源地址
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 安装最新版的Dcoker Engine和容器
$ sudo yum -y install docker-ce docker-ce-cli containerd.io
- 启动 Docker
$ sudo systemctl start docker
- 查看 Docker 版本
docker --version
# 或者
docker -v
Docker version 24.0.5, build ced0996
配置镜像加速
- 编辑配置文件
/etc/docker/daemon.json
cat >/etc/docker/daemon.json<<EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com/","https://ustc-edu-cn.mirror.aliyuncs.com/","https://docker.mirrors.ustc.edu.cn/"]
}
EOF
- 重新加载配置信息及重启docker服务
# 重新加载某个服务的配置文件
$ sudo systemctl daemon-reload
# 重新启动 docker
$ sudo systemctl restart docker
常见术语
镜像(image)
Docker镜像是一种特殊的文件系统,通常基于Linux的Root FileSystem。这个文件系统包含了能够在Linux内核上运行的程序以及相关的数据。你可以把Docker镜像理解为一个软件打包,其中包含了应用程序的所有必要组件,比如代码、运行时、库、环境变量和配置文件等。
当你使用Docker启动一个容器时,实际上就是在基于镜像创建一个运行环境。这个镜像就像是一个模板,用来生成容器。一个镜像可以启动多个容器,每个容器都是镜像的一个实例,它们共享相同的基础镜像,并且具有独立的运行环境。
Docker采用了类似于多次快照的存储技术,这使得镜像具有以下优势:
- 多个应用程序可以共享同一个底层镜像,这样可以节省存储空间,并且简化管理。
- 每个容器的IO操作和文件系统都是相互隔离的,这样可以保证容器之间的互相不受影响。
- 通过挂载不同的目录或者卷(Volume),可以为单个镜像提供不同的配置和数据,这样同一个镜像就可以用来运行多个不同的业务容器,实现了高度的灵活性和可重用性。
容器(Container)
镜像(Image)和容器(Container)在 Docker 中是两个核心概念,它们之间的关系可以类比为面向对象程序设计中的类(Class)和实例(Instance)。
-
镜像(Image)和类(Class):
- 镜像是一个只读的、静态的文件系统快照,它包含了运行应用程序所需的所有组件、依赖和配置信息。镜像可以看作是一个软件的打包和分发单元,类似于类中的定义,描述了应用程序的结构和配置。
-
容器(Container)和实例(Instance):
- 容器是镜像的一个运行时实例,它包含了镜像的可执行代码、运行时环境以及任何必要的文件系统修改。每个容器都是相互隔离的运行环境,可以被创建、启动、停止、删除等操作。容器类似于类的实例,具有自己的状态和行为。
-
创建和操作:
- 镜像可以被用来创建多个容器实例,就像类可以被用来创建多个对象实例一样。
- 容器可以运行镜像中定义的应用程序,类似于对象执行类中定义的方法。
-
生命周期:
- 镜像的生命周期独立于容器,镜像在构建后不会被修改,可以被多个容器实例共享和重用。
- 容器的生命周期由用户控制,可以根据需要创建、启动、停止和删除。每个容器都是临时性的,它们可以根据需要动态创建和销毁。
镜像和容器共同构成了 Docker 的核心架构,镜像提供了应用程序的静态定义,而容器则提供了运行时的实例化环境,使得应用程序的部署和管理变得更加灵活和便捷。
使用一个简单的Java类来说明镜像和容器的概念
如下示例:创建一个名为Client
的Java类,然后使用这个类来比喻镜像和容器的关系。
public class Client {
private String name;
public Client(String name) {
this.name = name;
}
public void greet() {
System.out.println("你好哇~, 我是 " + name);
}
public static void main(String[] args) {
Client client1 = new Client("九皇");
client1.greet();
Client client2 = new Client("叔叔");
client2.greet();
}
}
说明:
(1). 类(Class)和镜像(Image):
- 在这个比喻中,我们将
Client.java
文件比作是一个类的定义,就像镜像包含了应用程序的定义和配置。(2). 对象(Object)和容器(Container)
- 在Java中,我们通过创建
Client
类的实例来生成对象,例如client1
和client2
。这些对象类似于镜像的运行时实例,即容器。(3). 创建和操作:
- 我们可以使用
Client
类创建多个对象实例,比如client1
和client2
。同样,我们可以使用同一个镜像创建多个容器实例。(4). 生命周期:
- 类
Client
的定义是静态的,一旦编译完成就不会变化,这就好比镜像的不可变性。而对象client1
和client2
的生命周期由程序控制,可以根据需要创建和销毁,这就像容器的生命周期由用户控制一样。
基本使用
镜像操作
查看镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 04661cdce581 6 days ago 141MB
redis latest 7faaec683238 5 weeks ago 113MB
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
列属性的含义如下:
-
REPOSITORY
(仓库):- 表示镜像所属的仓库名称。在 Docker 中,仓库用于存储和管理镜像,可以把它理解为镜像的集合。通常,仓库名称由镜像的提供者或者组织名字加上镜像名组成,中间用斜杠分隔。例如,“nginx”、“redis”、“hello-world” 等都是仓库名称。
-
TAG
(标签):- 表示镜像的标签,用于区分同一个仓库中不同版本的镜像。标签可以是任何字符串,通常用来表示镜像的版本号或者特定的构建标识符。例如,“latest” 表示最新版本,也可以是自定义的版本号或者日期。
-
IMAGE ID
(镜像 ID):- 是每个镜像的唯一标识符,用于在 Docker 中唯一地识别一个镜像。镜像 ID 是一个长字符串,通常使用前12个字符来表示。它是在构建镜像时由 Docker 自动生成的。
-
CREATED
(创建时间):- 表示镜像创建的时间或者构建的日期。它显示了镜像的构建时间,以便于了解镜像的新旧程度。
-
SIZE
(大小):- 表示镜像的大小,以字节或者其他适当的单位进行显示。这个大小包括了镜像中所有层的大小总和,可以用来估算镜像在磁盘上的占用空间。
搜索镜像
如果你需要从网络中查找需要的镜像,可以通过如下命令搜索
$ docker search 镜像名称
例如:
[root@localhost docker]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3177 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 93 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 58 [OK]
kubeguide/tomcat-app Tomcat image for Chapter 1 31
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 18 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 13 [OK]
arm32v7/tomcat Apache Tomcat is an open source implementati… 11
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 7 [OK]
arm64v8/tomcat Apache Tomcat is an open source implementati… 6
maluuba/tomcat7-java8 Tomcat7 with java8. 6
unidata/tomcat-docker Security-hardened Tomcat Docker container. 5 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 3
jelastic/tomcat An image of the Tomcat Java application serv… 2
oobsri/tomcat8 Testing CI Jobs with different names. 2
cfje/tomcat-resource Tomcat Concourse Resource 2
fabric8/tomcat-8 Fabric8 Tomcat 8 Image 2 [OK]
chenyufeng/tomcat-centos tomcat基于centos6的镜像 1 [OK]
picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 1 [OK]
camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK]
99taxis/tomcat7 Tomcat7 1 [OK]
ppc64le/tomcat Apache Tomcat is an open source implementati… 1
softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK]
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementati… 0
[root@localhost docker]#
拉取镜像
从远程仓库中拉取(下载)指定名称的镜像到本地计算机。
docker pull 镜像名称
例如:
拉取 centos 镜像到本地,如果不声明 tag
镜像标签信息则默认拉取latest版本,也可以通过:https://hub.docker.com/ 搜索该镜像,查看支持的tag
信息。
docker pull redis:5
如果没有标签
5
那么默认将会拉取latest 版本
删除镜像
docker rmi 镜像名称:标签
或者
docker rmi 镜像ID
示例:
如下镜像清单中,删除 redis
镜像.
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 04661cdce581 6 days ago 141MB
redis latest 7faaec683238 5 weeks ago 113MB
hello-world latest feb5d9fea6a5 7 weeks ago 13.3kB
删除 Redis 镜像,有两种方法:
- 使用镜像名称和标签:
docker rmi redis:latest
这将会删除标签为 latest
的 Redis 镜像。
- 使用镜像ID:
docker rmi 7faaec683238
这将会删除镜像ID为 7faaec683238
的 Redis 镜像。
容器操作
查看
查看容器(运行中)
查看正在运行的容器。
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost docker]#
列属性的含义如下:
-
CONTAINER ID
(容器ID):- 表示容器的唯一标识符,由 Docker 自动生成。每个容器都有一个唯一的ID,用于在 Docker 中唯一地标识一个容器。
-
IMAGE
(镜像):- 表示容器所使用的镜像。该列显示了容器所基于的镜像的名称。
-
COMMAND
(命令):- 表示容器启动时运行的命令。这里显示的是容器启动时执行的命令或者指令。
-
CREATED
(创建时间):- 表示容器的创建时间。这个时间显示了容器创建的日期和时间。
-
STATUS
(状态):- 表示容器的当前状态。可以是运行中(running)、停止(exited)、暂停(paused)等状态。
-
PORTS
(端口映射):- 表示容器内部的端口与主机上的端口的映射关系。如果容器中有端口映射到主机上,则会显示在这一列。
-
NAMES
(名称):- 表示容器的名称。每个容器都可以指定一个名称,用于在 Docker 中唯一标识容器。
查看容器(已停止)
docker ps -f status=exited
这条命令 docker ps -f status=exited
是用于列出所有已经停止(exited)的容器。
命令详细解释一下:
docker ps
是 Docker 命令行工具提供的列出运行中容器的命令。(上面已经经过)-f status=exited
是一个选项,用于筛选容器。这里-f
表示过滤器,status=exited
表示筛选出状态为“exited”的容器。
查看容器(所有)
查看所有容器(包括运行和停止)
$ docker ps -a
查看容器(最近创建的x个)
$ docker ps -n x
示例:
查看最近创建的 5个容器
$ docker ps -n 5
创建和启动容器
如下:是 Docker 命令行工具提供的用于运行容器的命令
$ docker run [options] images [command] [arg...]
其中各个部分的含义如下:
$ docker run
:表示要运行容器的命令。[options]
:是一些选项,用于指定运行容器时的参数和配置。例如,可以通过-d
选项指定容器在后台运行,通过-p
选项指定端口映射等。images
:指定要运行的镜像名称。这个参数告诉 Docker 要基于哪个镜像来创建并运行容器。[command] [arg...]
:可选参数,用于指定容器启动时要执行的命令以及相应的参数。如果不提供这部分参数,则会使用镜像中默认的启动命令。
创建并进入容器
格式如下,运行容器并进入容器的 /bin/bash
$ docker run -it --name 容器名称(自定义) 镜像名称:标签 /bin/bash
注意:Docker容器运行必须有一个前台进程,如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
示例:
[root@localhost docker]# docker run --name mynginx -P nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
...[注意:这样运行命令后该终端将会被一直占用]...
查看运行中的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1c23f57bd5c nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp mynginx
[root@localhost ~]#
docker run --name mynginx -P nginx
该命令将会拉起一个nginx服务,端口(宿主机:随机,容器:80)
如需固定端口,需使用参数-p
例如:
docker run --name mynginx -p 8080:80 nginx
注意:
- 端口说明,前面的是宿主机、后面的是容器。(即:宿主机=8080,容器=80)
--name
后面的名称不能重复,即:docker ps -a
命令检索出来的数据中 names列不能重复.
守护方式创建容器
$ docker run -di --name 容器名称 镜像名称:标签
或者
$ docker exec -it 容器名称|容器ID /bin/bash
示例
docker run -di --name my_nginx_container nginx:latest
查看运行中的实例
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a2b3c4d5e6f nginx:latest "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp my_nginx_container
每一列的含义如下:
-
CONTAINER ID
(容器ID):- 表示容器的唯一标识符,由 Docker 自动生成。每个容器都有一个唯一的ID,用于在 Docker 中唯一地标识一个容器。
-
IMAGE
(镜像):- 表示容器所使用的镜像。该列显示了容器所基于的镜像的名称。
-
COMMAND
(命令):- 表示容器启动时运行的命令。这里显示的是容器启动时执行的命令或者指令。
-
CREATED
(创建时间):- 表示容器的创建时间。这个时间显示了容器创建的日期和时间。
-
STATUS
(状态):- 表示容器的当前状态。可以是运行中(Up)、停止(Exited)、暂停(Paused)等状态。
-
PORTS
(端口映射):- 表示容器内部的端口与主机上的端口的映射关系。如果容器中有端口映射到主机上,则会显示在这一列。
-
NAMES
(名称):- 表示容器的名称。每个容器都可以指定一个名称,用于在 Docker 中唯一标识容器。
停止与启动容器
# 停止容器
$ docker stop 容器名称|容器ID
# 启动容器
$ docker start 容器名称|容器ID