docker 入坑记
0、介绍
软件开发最大的麻烦事之一是环境配置。软件执行需要操作系统设置及各种库和组件的安装。
虚拟机是解决方案之一,但资源占用多、冗余步骤多、启动慢。
Linux 容器则有启动快、资源占用小、体积小等优点。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。是目前最流行的 Linux 容器解决方案。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1、安装
https://www.runoob.com/docker/debian-docker-install.html
2、使用
2.1、查询docker信息
$ docker version
# 或者
$ docker info
2.2、 image 文件(镜像)
Docker 把应用程序及其依赖,打包在 image 文件里面。
image 文件是容器模板,同一image文件可生成多个容器实例。
image 文件是通用的,可拷贝到其他机器使用,也可上传到仓库共享。
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
2.3、demo 试水
# 拉官方测试镜像
$ docker image pull hello-world
# 查询现有镜像文件
$ docker image ls
# 运行镜像文件
$ docker container run hello-world
2.4、容器文件
image 文件生成的容器实例,本身也是一个文件,称为容器文件。
一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
# 终止运行的容器文件,依然会占据硬盘空间,可使用 rm 删除
$ docker container rm [containerID]
2.5、Dockerfile 文件
文本文件,Docker 根据 该文件生成二进制的 image 文件。
Demo:
# koa-demos 项目
# step1
# 从git下载demo项目
$ git clone https://github.com/ruanyf/koa-demos.git
$ cd koa-demos
# 或手动下载
https://github.com/ruanyf/koa-demos/archive/master.zip
# step2
# 创建 .dockerignore 文件,下面内容不打进包里
.git
node_modules
npm-debug.log
# step3
# 创建 Dockerfile 文件,
#该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
FROM node:8.4
# 将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
COPY . /app
#指定接下来的工作路径为/app。
WORKDIR /app
# 在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
RUN ["npm", "install"]
# 将容器 3000 端口暴露出来, 允许外部tcp连接这个端口。
EXPOSE 3000/tcp
# step4
# 创建 image 文件
$ docker image build -t koa-demo .
# 或者
$ docker image build -t koa-demo:0.0.1 .
#打包好后查看
$ docker image ls
# step5
# 启动对应容器
$ docker container run -p 8000:3000 -it koa-demo /bin/bash
# 或者
$ docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
# -p参数:容器的 3000 端口映射到本机的 8000 端口。
# -it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
# koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
# /bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
# step6
# 启动框架
node demos/01.js
# 可在dockerfile添加 CMD node demos/01.js 替代
# 浏览器访问 http://127.0.0.1:8000,网页显示"Not Found",这是因为这个 demo 没有写路由。
# step7
# 终止容器与删除容器
# 在本机的另一个终端窗口,查出容器的 ID
$ docker container ls
# 停止指定的容器运行
$ docker container kill [containerID]
# 查出容器的 ID
$ docker container ls --all
# 删除指定的容器文件
$ docker container rm [containerID]
# step 8
# 发布image 文件
#登录 hub.docker.com,需要先注册账号
docker login
# 本地image 标注用户名和版本号
$ docker image tag [imageName] [username]/[repository]:[tag]
# 实例
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
# 重新构建image 文件
$ docker image build -t [username]/[repository]:[tag] .
# 最后发布 image 文件
$ docker image push [username]/[repository]:[tag]
2.5、compose 文件
Compose 是用于定义和运行多容器 Docker 应用程序的工具。
通过 Compose,可使用 YML 文件来配置/创建/启动 应用程序需要的所有服务。
# 下载安装
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 测试
docker-compose --version
# 使用
# 待补充。。
3、其他指令
-
启动容器
docker container run
命令是新建容器,每运行一次,就会新建一个容器;复用容器则用start指令
$ docker container start [containerID]
-
停止容器
docker container kill
命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号docker container stop
相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号
$ bash container stop [containerID]
-
查看容器输出
docker container logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出
$ docker container logs [containerID]
-
进入容器
docker container exec
命令用于进入一个正在运行的 docker 容器
$ docker container exec -it [containerID] /bin/bash
-
拷贝容器文件到本机
$ docker container cp [containID]:[/path/to/file] .
-
导入导出容器
# 导出容器(制作基础镜像)
$ docker export [containID] > [repository].tar
# 导入容器
$ cat [username]/[repository].tar | docker import - [username]/[repository]
# 导出镜像(无网络下多个镜像组合)
$ docker save [imageID] > [repository].tar
# 导入镜像
$ docker load < [repository].tar
-
获取镜像
docker pull [repository]
4、mysql部署
# 拉取mysql镜像
$ docker pull mysql:8.0.22
# 查看是否获取mysql镜像
$ docker images
# 运行容器
$ docker run --name mysql-test --privileged=true -p 3308:3306 -v /data/mysql/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.22
# 进入容器
$ docker exec -it study_mysql /bin/bash
# 连接 MySQL
$ mysql -u root -p
# 修改root 授权
$ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 可用宿主机或远程客户端工具访问
$ mysql -h 127.0.0.1 -P 3308 -u root -p
参考
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html