Docker 入坑记

docker 入坑记

0、介绍

软件开发最大的麻烦事之一是环境配置。软件执行需要操作系统设置及各种库和组件的安装。

虚拟机是解决方案之一,但资源占用多、冗余步骤多、启动慢。

Linux 容器则有启动快、资源占用小、体积小等优点。

 

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,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

https://blog.csdn.net/skh2015java/article/details/82659688

https://www.runoob.com/docker/docker-compose.html

https://www.hangge.com/blog/cache/detail_2411.html

posted @ 2020-11-27 19:19  heaventouch  阅读(145)  评论(0编辑  收藏  举报