Docker实战基础


docker核心概念总总结请见 Docker核心概念总结

Docker安装

Windows

访问 Docker 的官网
在这里插入图片描述
直接download for windows

如果你的电脑是Windows 10 64位专业版的操作系统,则在安装 Docker 之前需要开启一下Hyper-V(注意windows家庭版没有Hyper-V需要先手动下载,且如果你的电脑上之前使用过虚拟机,windows会把Hyper-V默认屏蔽掉,不然会产生冲突),开启方式如下。打开控制面板,选择程序:
在这里插入图片描述

启用或关闭Windows功能
在这里插入图片描述

勾选上Hyper-V,点击确定。
在这里插入图片描述

完成更改后需要重启一下计算机。

开启了Hyper-V后,我们就可以对 Docker 进行安装了,打开安装程序后,等待片刻点击Ok即可:

在这里插入图片描述
安装完成后,我们仍然需要重启计算机,重启后,若提示如下内容:
在这里插入图片描述

它的意思是询问我们是否使用 WSL2,这是基于 Windows 的一个 Linux 子系统,这里我们取消即可,它就会使用我们之前勾选的Hyper-V虚拟机。

因为是图形界面的操作,这里就不介绍 Docker Desktop 的具体用法了。

Linux

下面来看看 Linux 中如何安装 Docker,这里以 CentOS7 为例。在测试或开发环境中,Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,执行这个脚本后就会自动地将一切准备工作做好,并且把 Docker 的稳定版本安装在系统中。

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

安装完成后直接启动服务:

systemctl start docker

推荐设置开机自启,执行指令:

systemctl enable docker

Docker 中的几个概念

  • 镜像:镜像就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器
  • 容器:容器是用镜像创建的运行实例,Docker 利用容器独立运行一个或一组应用。它可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。 可以把容器看作是一个简易的 Linux 环境和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
  • 仓库:仓库是集中存放镜像文件的场所。仓库和仓库注册服务器是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。 仓库分为公开仓库和私有仓库两种形式,最大的公开仓库是 DockerHub,存放了数量庞大的镜像供用户下载,国内的公开仓库有阿里云、网易云等
  • 总结:通俗点说,一个镜像就代表一个软件;而基于某个镜像运行就是生成一个程序实例,这个程序实例就是容器;而仓库是用来存储 Docker 中所有镜像的。

Docker 初体验

下面我们来对 Docker 进行一个初步的使用,这里以下载一个 MySQL 的镜像为例(在CentOS7下进行)。

和 GitHub 一样,Docker 也提供了一个 DockerHub 用于查询各种镜像的地址和安装教程,为此,我们先访问 DockerHub:https://hub.docker.com/

在这里插入图片描述

左上角搜索MySQL
在这里插入图片描述
可以看到相关 MySQL 的镜像非常多,若右上角有OFFICIAL IMAGE标识,则说明是官方镜像,所以我们点击第一个 MySQL 镜像:

在这里插入图片描述
右边提供了下载MySQL镜像的指令为 docker pull mysql,但该指令默认下载MySQL镜像的最新版本。

Tags页面可以查询下载指定版本的镜像

然而下载镜像的过程是非常慢的,所以我们需要配置一下镜像源加速下载

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://iz0mi6a7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

依次执行配置指令即可。

Docker 镜像指令

查看镜像

Docker 需要频繁地操作相关的镜像,所以我们先来了解一下 Docker 中的镜像指令。

若想查看 Docker 中当前拥有哪些镜像,则可以使用 docker images 命令。

[root@izrcf5u3j3q8xaz ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
MySQL         5.7.32    f07dfa83b528   11 days ago     448MB
tomcat        latest    feba8d001e3f   2 weeks ago     649MB
nginx         latest    ae2feff98a0c   2 weeks ago     133MB
hello-world   latest    bf756fb1ae65   12 months ago   13.3kB

其中REPOSITORY为镜像名,TAG为版本标志,IMAGE ID为镜像 id(唯一的),CREATED为创建时间,注意这个时间并不是我们将镜像下载到 Docker 中的时间,而是镜像创建者创建的时间,SIZE为镜像大小。

该指令能够查询指定镜像名docker image MySQL :会查询出 Docker 中的所有 MySQL 镜像

[root@izrcf5u3j3q8xaz ~]# docker images MySQL
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
MySQL        5.6       0ebb5600241d   11 days ago     302MB
MySQL        5.7.32    f07dfa83b528   11 days ago     448MB
MySQL        5.5       d404d78aa797   20 months ago   205MB

下载镜像

若是要下载镜像,则使用:docker pull MySQL:5.7

docker pull是固定的,后面写上需要下载的镜像名及版本标志;若是不写版本标志,而是直接执行docker pull MySQL,则会下载镜像的最新版本。

删除镜像

docker image rm MySQL:5.5

若是不指定版本,则默认删除的也是最新版本。

还可以通过指定镜像 id 进行删除:

docker image rm bf756fb1ae65

然而此时报错了:

[root@izrcf5u3j3q8xaz ~]# docker image rm bf756fb1ae65
Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is being used by stopped container d5b6c177c151

这是因为要删除的hello-world镜像正在运行中,所以无法删除镜像,此时需要强制执行删除:

docker image rm -f bf756fb1ae65

该指令会将镜像和通过该镜像执行的容器全部删除,谨慎使用。

删除所有镜像:

docker rmi -f $(docker images MySQL -q)

首先通过docker images MySQL -q查询出 MySQL 的所有镜像 id,-q表示仅查询 id,并将这些 id 作为参数传递给docker rmi -f指令,这样所有的 MySQL 镜像就都被删除了。

Docker 容器指令

运行的前提是你拥有这个镜像,所以先下载镜像:

docker pull tomcat:8.0-jre8

运行容器

若需要通过镜像运行一个容器,则使用:

docker run -d -p 8080:8080 --name tomcat01 tomcat:8.0-jre8
  • -d表示后台运行
  • -p 8080:8080表示将宿主机端口与容器内的端口进行映射。解释一下这两个端口的作用(8080:8080),第一个 8080 为宿主机端口,第二个 8080 为容器内的端口,外部访问 8080 端口就会通过映射访问容器内的 8080 端口。
  • --name tomcat01表示为该容器取一个别名叫tomcat01
  • -v /opt/apps:/usr/local/tomcat/webapps:使用数据卷,表示将宿主机/opt/apps目录映射到容器的/usr/local/tomcat/webapps目录,以后修改宿主机/opt/apps目录便可同步影响到容器。

然后向外部开放8080端口即可从外部网络访问Tomcat了

查看容器

docker ps

在这里插入图片描述
其中CONTAINER_ID为容器的 id,IMAGE为镜像名,COMMAND为容器内执行的命令,CREATED为容器的创建时间,STATUS为容器的状态,PORTS为容器内服务监听的端口,NAMES为容器的名称。

  • -a :该参数会将运行和非运行的容器全部列举出来docker ps -a
  • -q:数将只查询正在运行的容器 iddocker ps -q

其他命令

  • 停止容器:docker stop c2f5d78c5d1a
  • 启动容器:docker start c2f5d78c5d1a
  • 重启容器:docker restart c2f5d78c5d1a
  • 杀死容器:docker kill c2f5d78c5d1a

以上指令都能够通过容器的 id 和容器名称两种方式配合使用。


当容器被停止之后,容器虽然不再运行了,但仍然是存在的,若是想删除它,则使用指令:

docker rm d5b6c177c151

若是想删除正在运行的容器,则需要添加-f参数强制删除:

docker rm -f d5b6c177c151

若是想删除所有容器,则可以使用组合指令:

docker rm -f $(docker ps -qa)

先通过docker ps -qa查询出所有容器的 id,然后通过docker rm -f进行删除。

宿主机查看容器内部

当容器以后台的方式运行时,我们无法知晓容器的运行状态,若此时需要查看容器的运行日志,则使用指令:

docker logs 289cc00dc5ed
  • -f:显示实时情况
  • -t:显示时间戳

查看容器内运行了哪些进程,可以使用指令:

docker top 289cc00dc5ed

若是想与容器进行交互,则使用指令:

docker exec -it 289cc00dc5ed bash

在这里插入图片描述

此时终端将会进入容器内部,执行的指令都将在容器中生效,在容器内只能执行一些比较简单的指令,如:ls、cd 等,若是想退出容器终端,重新回到 CentOS 中,则执行exit即可。

现在我们已经能够进入容器终端执行相关操作了,那么该如何向 tomcat 容器中部署一个项目呢?

docker cp ./test.html 289cc00dc5ed:/usr/local/tomcat/webapps

通过docker cp指令能够将文件从 CentOS 复制到容器中,./test.html为 CentOS 中的资源路径,289cc00dc5ed为容器 id,/usr/local/tomcat/webapps为容器的资源路径,此时test.html文件将会被复制到该路径下。

[root@izrcf5u3j3q8xaz ~]# docker exec -it 289cc00dc5ed bash
root@289cc00dc5ed:/usr/local/tomcat# cd webapps
root@289cc00dc5ed:/usr/local/tomcat/webapps# ls
test.html
root@289cc00dc5ed:/usr/local/tomcat/webapps#

若是想将容器内的文件复制到 CentOS 中,则反过来写即可:

docker cp 289cc00dc5ed:/usr/local/tomcat/webapps/test.html ./

虽然使用 Docker 启动软件环境非常简单,但同时也面临着一个问题,我们无法知晓容器内部具体的细节,比如监听的端口、绑定的 ip 地址等等,好在这些 Docker 都帮我们想到了,只需使用指令:

docker inspect 923c969b0d91

Docker 数据卷

Docker 中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中。
现在若是想将宿主机中/opt/apps目录与容器中webapps目录做一个数据卷,则应该这样编写指令:

docker run -d -p 8080:8080 --name tomcat01 -v /opt/apps:/usr/local/tomcat/webapps tomcat:8.0-jre8

然而此时访问 tomcat 会发现无法访问:
在这里插入图片描述
这就说明我们的数据卷设置成功了,Docker 会将容器内的webapps目录与/opt/apps目录进行同步,而此时/opt/apps目录是空的,导致webapps目录也会变成空目录,所以就访问不到了。

此时我们只需向/opt/apps目录下添加文件,就会使得webapps目录也会拥有相同的文件,达到文件共享

这种方式设置的数据卷称为自定义数据卷,因为数据卷的目录是由我们自己设置的

Docker 还为我们提供了另外一种设置数据卷的方式:

docker run -d -p 8080:8080 --name tomcat01 -v aa:/usr/local/tomcat/webapps tomcat:8.0-jre8

此时的aa并不是数据卷的目录,而是数据卷的别名,Docker 会为我们自动创建一个名为aa的数据卷,并且会将容器内webapps目录下的所有内容复制到数据卷中,该数据卷的位置在/var/lib/docker/volumes目录下:

[root@centos-7 volumes]# pwd
/var/lib/docker/volumes
[root@centos-7 volumes]# cd aa/
[root@centos-7 aa]# ls
_data
[root@centos-7 aa]# cd _data/
[root@centos-7 _data]# ls
docs  examples  host-manager  manager  ROOT

镜像与容器的打包,备份与加载

docker commit -m "描述信息" -a "镜像作者" tomcat01 my_tomcat:1.0

该指令能够将容器打包成一个镜像,此时查询镜像:

[root@centos-7 _data]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_tomcat           1.0                 79ab047fade5        2 seconds ago       463MB
tomcat              8                   a041be4a5ba5        2 weeks ago         533MB
MySQL               latest              db2b37ec6181        2 months ago        545MB

若是想将镜像备份出来,则可以使用指令:

docker save my_tomcat:1.0 -o my-tomcat-1.0.tar
[root@centos-7 ~]# docker save my_tomcat:1.0 -o my-tomcat-1.0.tar
[root@centos-7 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  公共  视频  文档  音乐
get-docker.sh    my-tomcat-1.0.tar     模板  图片  下载  桌面

若是拥有.tar格式的镜像,该如何将其加载到 Docker 中呢?执行指令:

docker load -i my-tomcat-1.0.tar
root@centos-7 ~]# docker load -i my-tomcat-1.0.tar
b28ef0b6fef8: Loading layer [==================================================>]  105.5MB/105.5MB
0b703c74a09c: Loading layer [==================================================>]  23.99MB/23.99MB
......
Loaded image: my_tomcat:1.0
[root@centos-7 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my_tomcat           1.0                 79ab047fade5        7 minutes ago       463MB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值