访问 Docker 的官网
直接download for windows
如果你的电脑是Windows 10 64位专业版的操作系统,则在安装 Docker 之前需要开启一下Hyper-V(注意windows家庭版没有Hyper-V需要先手动下载,且如果你的电脑上之前使用过虚拟机,windows会把Hyper-V默认屏蔽掉,不然会产生冲突),开启方式如下。打开控制面板,选择程序:
完成更改后需要重启一下计算机。
开启了Hyper-V后,我们就可以对 Docker 进行安装了,打开安装程序后,等待片刻点击Ok即可:
安装完成后,我们仍然需要重启计算机,重启后,若提示如下内容:
它的意思是询问我们是否使用 WSL2,这是基于 Windows 的一个 Linux 子系统,这里我们取消即可,它就会使用我们之前勾选的Hyper-V虚拟机。
因为是图形界面的操作,这里就不介绍 Docker Desktop 的具体用法了。
下面来看看 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 进行一个初步的使用,这里以下载一个 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 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 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 中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中。
现在若是想将宿主机中/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