01 Docker要解决什么问题
一、环境配置的难题
编程开发最麻烦的一件事,就是环境配置。如果你的计算机环境不符合要进行测试或使用的软件的要求,那么你就无法进行测试使用。同时,好多老旧模块已经发生了与当前环境不兼容的情况,而且随着技术发展速度越来越快,这些问题将会越来越严重。
环境的配置复杂费时,降低了开发的效率。很多人想,可不可以在根本上解决问题,在安装的时候就把原始环境复制过来。
二、虚拟机
虚拟机就是一种带环境安装的解决方案,它可以在一种操作系统里运行另一个操作系统,比如Windows中运行Linux。
但是虚拟机这个方案也有几个缺点:
- 资源占用多
- 冗余步骤多
- 启动缓慢
三、Linux容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
四、Docker来了
Docker就是属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将某一应用程序与改程序所需要的环境打包在一个文件里。在Docker中运行这个文件,就会产生一个虚拟的容器,程序在容器里运行,就好像在物理机上运行一样。
五、Docker的用途
1.简化配置。
2.混合云。
3.微服务架构。
02 Docker基础
一、Docker安装
二、image文件
Docker把应用程序及其所需要的环境依赖,打包放在image文件中。只有拉取拉image文件才能生成容器实例。同一个image文件,可以生成多个同时运行的容器实例。
iamge是二进制文件,一个image文件常常通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
#列出本机所有iamge文件
docker images
#删除image文件
docker image rm [iamgeName]
image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。
Docker 的官方仓库 Docker Hub是最重要、最常用的 image 仓库。
三、容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
#列出本机正在运行的容器
docker container ls
//或者
docker ps
#列出本机所有容器,包括终止运行的容器
docker container ls --all
//或者
docker ps -a
上面命令的输出结果之中,包括容器的 ID。很多地方都需要提供这个 ID,比如终止容器运行的docker container kill
命令。
docker container kill [containerID]
终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm
命令删除。
docker container rm [containerID]
四、实例
1.hello world
下面,我们通过最简单的 image 文件"hello world",感受一下 Docker。
首先,将iamge文件从仓库抓取到本地。
docker image pull library/hello-world
docker image pull
是抓取image文件的命令
library/hello-world
是image文件在仓库里的位置
抓取成功以后,可以查看这个image文件,使用命令
docker images
现在,可以运行这个image文件。
docker container run hello-world
#或者省略container
docker run hello-world
如果运行成功,你会在屏幕上读到下面的输出。
Hello from Docker!
This message shows that your installation appears to be working correctly.
··· ···
输出相关提示后,hello-world
就会停止运行,容器自动终止。
有些容器不会自动终止,因为提供的是服务。比如,安装运行Ubuntu的iamge,就可以在命令行体验Ubuntu系统。
docker container run -it ubuntu bash
//或者
docker run -it ubuntu bash
对于那些不会自动终止的容器,必须使用docker container kill
命令手动终止。
2.sqli-labs
接下来,我们部署某一服务——SQL注入练习平台sqli-labs
首先在docker中搜索sqli-labs
docker search sqli-labs
在找到相应的镜像后,进行拉取(我用的是NAME为acgpiano/sqli-labs的镜像)
docker pull acgpiano/sqli-labs
Docker会将sqli-labs的镜像下载到本地,等待下载完毕后,就可以运行镜像产生容器
docker run -dt --name sqli -p 80:80 --rm acgpiano/sqli-labs
-d
后台运行容器
--name sqli
为容器指定一个名称 'sqli'
-p 80:80
将容器的80端口映射到本地的80端口
--rm
容器退出时就能够自动清理容器内部的文件系统。
五、Docker命令
1. docker start
前面的docker run
命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker start
命令,它用来启动已经生成、已经停止运行的容器文件。
docker start [containerID]
2. docker stop
前面的docker kill
命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker stop
命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。
docker stop [containerID]
这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。
3. docker logs
docker logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令查看输出。
docker logs [containerID]
4. docker exec
docker exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
docker exec -it [containerID] /bin/bash
5. docker cp
docker cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
docker cp [containID]:[/path/to/file]