Docker学习笔记

原文

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] 

你可能感兴趣的:(Docker学习笔记)