Docker初识
为什么要使用 Docker
Docker 可以将应用以集装箱的方式进行打包,通过镜像的方式可以实现在不同的环境下进行快速部署,在团队中还可实现一次打包,多次共享,使用 Docker 可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
例如,我们在本地将编译测试通过的程序打包成镜像,可以快速的在服务器环境中进行部署,有时也能解决不同的开发环境造成的问题 “明明我本地是好的,但是一到服务器就不行”。
为什么要使用 Docker?总结下来其有以下优点:
-
高效的利用系统资源(节约成本)
-
持续交付与部署(敏捷)
-
多平台的迁移更容易(可移植性)
-
容易的沙箱机制(安全性)
Docker 架构一瞥
中间部位为我们进行 Docker 操作的宿主机,其运行了一个 Docker daemon 的核心守护程序,负责构建、运行和分发 Docker 容器。
左边为 Docker 客户端,其与 Docker 守护进程进行通信,客户端会将 build、pull、run 命令发送到 Docker 守护进程进行执行。
右边为 Docler 注册表存储 Docker 镜像,是一个所有 Docker 用户共享 Docker 镜像的服务,Docker daemon 与之进行交互。
什么是 Docker 镜像
Docker 会把应用程序及依赖打包进镜像(Images)里,提供了容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),通过这个镜像文件可生成 Docker 容器。
例如:这个镜像文件包含了一个完整的 Ubuntu 系统,我们可以在 Ubuntu 镜像基础之上安装了 Redis、Mysql 等其它应用程序,可以回顾下 Docker 架构一瞥 在 DOCKER_HOST 里面有个 images。
另外在制作好镜像文件之后可以拷贝到其它机器使用,它是通用的,镜像的制作可以基于 Dockerfile 构建后面会讲解。
什么是 Docker 容器
容器是镜像的可运行实例,你可以使用 Docker API 创建、启动、停止、移动或删除它,
在默认情况下,容器与其它容器及其主机是隔离的,拥有自己的独立进程空间、网络配置。
容器由其镜像以及在创建或启动容器时提供的任何配置选项定义。当容器被删除时,对其状态的任何未存储在持久存储中的更改都会消失。
Docker安装
Docker 是一个开源的商业产品,提供了社区版(CE)和企业版(EE),以下也都是基于企业版进行介绍,我这里操作系统采用的 Linux 下 CentOS 系统,更多安装方式也可参照官网安装指南 https://docs.docker.com/install/
安装Docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
启动
systemctl start docker
查看docker版本
$ docker version
$ docker info
卸载
docker info
yum remove docker docker-common docker-selinux docker-engine
yum list installed | grep docker
yum remove 。。。
rm -rf /var/lib/docker
更改 docker 源
这个看情况,因为 Docker 的源在国外,国内访问速度可能会不稳定,有需要的可以按照以下步骤更换为国内源
- 编辑 /etc/docker/daemon.json 文件,输入 docker-cn 镜像源地址
采用阿里云镜像加速:
vim /etc/docker/daemon.json
{
"registry-mirrors":
[
"https://registry.docker-cn.com"
]
}
- 重启docker服务
# 重载所有修改过的配置文件
systemctl daemon-reload
systemctl restart docker
镜像构建初探
抓取 image 文件到本地
hello-world 为镜像名字,docker image pull 为抓取镜像命令,Docker 官方提供的 image 文件都放在 library 默认组里,library/hello-world 也就为 image 文件的位置。
$ docker image pull hello-world
#或者
$ docker run hello-world #没有先自动pull,然后运行
查看 image 文件列表
image 文件抓取成功通过 docker image ls 命令查看当前都有哪些镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 9 months ago 1.84kB
运行 image 文件
执行 docker container run
命令会生成一个正在运行的容器实例,另外 docker container run
发现本地没有指定的 image 文件,其自身还有自动抓取 image 文件功能,就是上面讲解的 docker image pull
命令
$ docker container run hello-world
Hello from Docker!
# 以下内容省略
...
查看容器列表
使用 docker ps
或 docker container ls
命令用来查看正在运行的容器列表,这个时候是没有正在运行的容器实例的,因为在以上 docker container run hello-world
命令执行之后 hello-world
就会停止,容器也会随着自动停止,但并不是所有的容器运行之后也都会停止的
$ docker ps
通过 docker ps -a
或 docker container ls -a
命令可以查看所有的容器实例,包含已经停止的
构建一个 Nginx 镜像
以下命令会用 nginx 镜像启动一个容器,命名为 nginxserver,并映射到 8081 端口
$ docker container run --name nginxserver -d -p 8081:80 nginx
-d:后台进程守护
-p:端口映射
nginx:镜像名称
现在就可以使用 http://localhost:8081/ 来访问这个 Nginx 服务器,由于我这里是在虚拟机上安装的 Docker 因此要使用我的虚拟机地址 http://192.168.6.128:8081/ 进行访问,同样如果你是在虚拟机、云服务器上安装的 Docker 也要使用相应的 ip 来访问,如果是在本机直接 localhost 就可以
终止容器
通过 docker container kill[containID]
命令终止正在运行的容器
删除容器文件
上面的终止容器并不会删除容器文件,仅仅是容器停止运行
由于已经终止容器文件依然会占据着我们的磁盘空间,在不使用的情况可通过 docker container rm [containerID]
命令删除
$ docker container rm b7bf26745b3f a662ec198a83
删除镜像文件
同样删除一个镜像文件也很简单执行 docker image rm [imageID]
命令即可
Dockerfile实践
Dockerfile 是由一系列的参数、命令构成的可执行脚本,用来构建、定制 Docker 镜像。本节通过一个 Node.js 的简单项目为例,介绍下如何编写 Dockerfile 文件、如何在 Docker 容器里运行 Node.js 项目。
Nodejs项目准备
/home/hello-docker/app 目录下新建 app.js
const http = require('http');
const hostname = '0.0.0.0';
const port = 3000;
const server = http.createServer((req,res)=>{
res.statusCode = 200;
res.setHeader('Content-Type','text/html;charset=utf-8');
res.end('3000');
})
server.listen(port,hostname,()=>{
console.log(`Server running at http://${hostname}:${port}/`);
});
/home/hello-docker/app 目录下运行命令 npm init -y
Dockerfile 编写
首先在项目根目录下创建 .dockerignore 文件,把不需要打包进 Docker Image 里的文件进行过滤
# /home/hello-docker/.dockerignore
.git
node_modules
Dockerfile
项目根目录/home/hello-docker下新建 Dockerfile 文件
FROM node
RUN mkdir -p /home/hello-docker/app
COPY ./app /home/hello-docker/app
WORKDIR /home/hello-docker/app
RUN npm install
EXPOSE 3000
CMD npm start
-
FROM:FROM 是构建镜像的基础源镜像,该 Image 文件继承官方的 node image
-
RUN:后面跟的是在容器中执行的命令
-
WORKDIR:容器的工作目录
-
COPY:拷贝文件至容器的工作目录下,.dockerignore 指定的文件不会拷贝
-
EXPOSE:将容器内的某个端口导出供外部访问
-
CMD:Dockerfile 执行写一个 CMD 否则后面的会被覆盖,CMD 后面的命令是容器每次启动执行的命令,多个命令之间可以使用 && 链接,例如 CMD git pull && npm start
构建 hello-docker 镜像文件
Dockerfile 文件创建好之后,使用 docker image build
命令创建镜像文件,-t 参数用来指定镜像的文件名称,最后一个 . 也不要省略,表示 Dockerfile 文件的所在目录
$ docker image build -t hello-docker .
执行以上命令之后,查看新生成的镜像文件 hello-docker
运行容器
镜像构建成功之后通过 docker container run 命令来生成一个容器,几个参数说明:
-
-d:表明容器的运行模式在后台
-
-p:端口映射,将本机的 30000 端口映射到容器的 30010 端口,这样在外网就可通过 30000 端口访问到我们的服务
-
hello-docker:为我们的镜像名字
$ docker container run -d -p 3000:3001 hello-docker
执行以上命令之后通过 docker ps 查看我们刚刚运行的容器信息
访问 curl http://localhost:3000
可以进行测试
检查日志
查看运行日志, docker logs -f [containerID]
容器进入退出
为了方便排查内部容器文件,可以通过 docker exec -it [containerID] /bin/sh 命令进入容器