Docker知识杂记

配环境问题的终结者

Posted by tianhaoo on January 20, 2018 本文阅读量

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,

然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口。

下面是使用docker的一些笔记

组成

  • Docker Client:DOcker提供给用户的客户端。输入docker提供的命令来管理本地或者远程的服务器

  • Docker Deamon:Docker服务的守护进程。docker deamon会接收client发过来的指令,并对服务器进行具体的操作。

  • Docker Images:俗称Docker的镜像。就是类似镜像

  • Docker Registry:可以认为是Docker Images的仓库,就像git的仓库一样,是用来管理docker的镜像的,提供了镜像的上传下载和浏览的功能。

  • Docker Container:俗称docker的容器,这个是真正跑项目程序、消耗机器资源、提供服务的地方。Docker Container通过Docker Images启动,在Docker Images的基础上运行你需要的代码。你可以认为Docker Container提供了系统硬件环境,然后使用了Docker Images 这些制作好的系统盘,再加上你的项目代码,跑起来就可以提供服务了。

上手

  1. 官网下载

  2. 安装完成后运行docker version 说明没毛病(最好使用powershell)。

  3. 查看所有命令docker

  4. 常用简单命令

    • 查看Docker Container docker[-compose] ps [-a]
    • 从Restory下载一个Image docker pull image-name
    • 启动容器 docker-compose up -d {容器名称}
    • 关闭容器 docker-compose stop {容器名称}
    • 删除所有容器 docker-compose down
    • 进入容器 docker-compose exec {container-name} bash
    • 要退出容器执行 exit
    • 编辑容器的默认配置,打开docker-compose.yml
    • 查看images docker images
    • 将一个image放到docker container里面跑起来 docker run image-name
    • 停止并删除运行中的容器docker rm -f container-name
    • 删除镜像 docker rmi image-name

用docker搭建mysql

$ docker container run \
  -d \
  --rm \
  --name wordpressdb \
  --env MYSQL_ROOT_PASSWORD=123456 \
  --env MYSQL_DATABASE=wordpress \
  mysql:5.7

该命令的参数含义如下

-d:容器启动后,在后台运行。
--rm:容器终止运行后,自动删除容器文件。
--name wordpressdb:容器的名字叫做wordpressdb
--env MYSQL_ROOT_PASSWORD=123456:向容器进程传入一个环境变量MYSQL_ROOT_PASSWORD,该变量会被用作 MySQL 的根密码。
--env MYSQL_DATABASE=wordpress:向容器进程传入一个环境变量MYSQL_DATABASE,容器里面的 MySQL 会根据该变量创建一个同名数据库(本例是WordPress)。

基于LaraDock在Docker中快速构建Larevel应用

  1. 安装LaraDock, 在一个空文件夹里 git clone https://github.com/LaraDock/laradock.git

  2. 创建环境变量文件cp env-example .env

  3. 启动需要的容器 docker-compose up -d apache2 mysql nginx和mysql都是容器,docker-compose类似一个管理多个容器的东西可以从下列列表中选取自己需要的容器组合

    nginx, hhvm, php-fpm, mysql, redis, postgres, mariadb, neo4j, mongo, apache2, caddy, memcached, beanstalkd, beanstalkd-console, workspace
    

PS: workspace 和 php-fpm 将运行在大多数容器中,所以不需要在up命令中加上他们

  1. 启动之后,进入workspace容器 docker-compose exec -u laradock workspace bash

  2. 执行laravel安装 composer create laravel/laravel {app-name}

  3. 修改目录映射(apache不需要)

  4. 进入app-name目录编辑.env数据库配置
    DB_HOST=mysql
    something else
    
  5. 在浏览器中访问http://localhost/

给docker设置代理服务器

默认情况下这个配置文件夹并不存在,我们要创建它。

$ mkdir -p /etc/systemd/system/docker.service.d

创建一个文件 /etc/systemd/system/docker.service.d/http-proxy.conf

包含 HTTP_PROXY 环境变量:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "HTTPS_PROXY=http://proxy.example.com:80/"

如果有局域网或者国内的registry,我们还需要使用 NO_PROXY 变量声明一下,比如你可以能国内的daocloud.io放有镜像:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,daocloud.io"

刷新systemd配置:

$ sudo systemctl daemon-reload

用系统命令验证环境变量加上去没:

$ systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

重启docker

$ sudo systemctl restart docker

给docker设置国内镜像

修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

用Docker运行Nginx

背景

有时候需要在网上放几个静态页面,或者构建几个有简单逻辑的网页服务,可能根本不需要考虑性能,不需要考虑美观可维护啥的,只需要很短时间就能跑得起来,不需要的时候直接关掉又对我们现有的服务器不会产生任何影响,甚至再次需要该服务的时候又能很快再次调用起来。我最近就碰到了这样一个需求,要在某个答辩中以网页的形式展示一下一些简单的东西,这时候才发现docker在这种应用场景下简直是无比的方便。

步骤

其实官网已经介绍的很详细了 官网链接

只要下面一行代码

docker run --name front-end-nginx -v /root/wwwroot/front_end:/usr/share/nginx/html:ro -p 8080:80 -d nginx

不需要的时候直接 docker stop 、 rm 就行了,就像关闭一个程序一样,干净利落。

Docker运行MySQL

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysq:5.7

## Docker 运行Redis

docker run --name some-redis -d redis