Docker入门与实战

Posted by Forezp on September 12, 2018

Docker简介

Docker是容器技术的一个代表,容器的技术从本质上讲是程序打包、隔离的技术,不是一个很新的技术,核心的技术在内核中已经存在很久了。但容器技术被大众所用,变成这么流行,这么火爆的技术是因为Docker。Docker在13年被开源,变得越来越流行,Docker在微服务领域、云计算领域有着广泛的应用。这是为什么呢。任何技术的流行可能的原因有两点,一是能够解决大家的痛点,二是能够能够适应潮流.docker理顺了软件包的问题,有了docker运行一个镜像是非常容易的,不需要做各种环境的配置。

什么是Docker?官方的解释如下:

an open resource project to pack,ship and run any application as a lightweght containner.

Build, Manage and Secure Your Apps Anywhere. Your Way.

可以粗糙的认为是一个轻量级的虚拟机,因为在某种程度上来讲,docker和虚拟机是有非常多的相似点。它们都是讲应用放在相对独立的环境里,调度主机的内核来运行。但Docker确实不是虚拟机,这张图是虚拟机和Docker的对比图,左边这张图是虚拟机,右边是Docker,左边的虚拟机子宿主机上有一层Hypervisor虚拟层,虚拟出了硬件和设备,在虚拟层上面会安装GuestOs,然后再运行各种各样的程序,docker 是不一样的,docker是不一样的,它在宿主机上有一个Docker engine,然后再运行各种各样的应用程序。因为它没有虚拟机层,它会比虚拟机轻量很多,包括程序运行速度也非常的快。

Docker为何这么火?天时地利人和。Docker 不是什么新技术,Docker的镜像版本管理是其火的根本原因。

Docker安装

Centos安装:

1
2
3
4
5
6
安装:
yum search docker
yum -y install docker-io

查看基本信息:docker info 
启动:servie start docker

Docker架构

image.png

从这张图可以看出,Docker的架构是非常简答的。中间是Host,上面装了一个Docker daemon的守护进程,守护进程应用做很多docker的操作,那么谁让 docker daemon来做这些操作呢,是最左边client,比如我们再终端操作输入dokcer的命令,客户端讲命令发送给docker守护进程,让docker去做一些操作,比如从最右边的镜像仓库拉取镜像到宿主机上,然后在宿主机上跑镜像,运行容器。

常见的Docker命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -p 80:80 -d  docker.io/nginx
docker cp index.html containerId://usr/share/nginx/html
docker exec -it containeId /bin/bash
docker images
docker ps [-a -q]
docker stop containerId
docker rm containerId
docker rmi imagesId

docker commit –m ’msg’ containerId [name] 
docker build
docker pull
docker push
docker login

Dockerfile

常用命令

命令 用途
WORKDIR RUN ENTRYPINT CMD执行的工作目录
ENV 添加环境变量
ADD 添加文件,会解压压缩包
COPY 复制文件
ONBUILD 触发器
VOLUME 挂载卷
FROM 基础镜像
ENTRYPOINT 基础命令
RUN 执行命令
CMD 启动程序命令,拼接在基础命令后
EXPOSE 暴露端口
MAINTAINER 维护者

如果不理解可以参考博客https://www.cnblogs.com/51kata/category/789766.html

第一个Dockerfile

1
2
3
FROM alpine:latest
MAINTAINER fzp
CMD echo 'hello docker'

这个镜像的基础镜像是alpine:latest,所有者是fzp,容器启动的时候会执行echo命令。

执行:

1
2
3
docker build -t hello-img .

docker run hello-img

控制台输出: hello docker

第二个Dockerfile

1
2
3
4
5
6
7
8
FROM ubuntu
MAINTAINER fzp
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update 
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
EXPOSE 80

这个镜像稍微复杂点,基础镜像是ubuntu,镜像所属者fzp,再一下一层是设置镜像加速的地址。将index.html拷贝到镜像的目录下。最后以前台进程的形式启动。

index.html

1
today i'm happy

执行命令:

1
2
3
docker build -t forezp/hello.nginx .

docker run forezp/hello.nginx

curl localhost

控制台输出:today i’m happy

Docker存储

独立于容器之后的独立化存储

第一种方式:

1
docker run -p 80:80 -d -v $PWD/code:/var/www/html nginx

-v指令 宿主的路径:容器路径

将容器的路径的文件夹或者文件挂载到宿主机的路径。

第二种方式:

docker run -volumes-from …

1
2
3
4
5
6
7
8
9
10
11
12
13
docker create -v $PWD/data:/var/mydata --name data_container ubuntu

docker run -it --volumes-from data_container ubuntu /bin/bash

cd /var/mydata

touch what.txt

exit 

cd data

ls

可以查看宿主机的data目录有what.txt文件

镜像仓库

Regiestry,使用官方的docker hub。

1
2
3
4
5
6
7
8
9
10
11
docker search whalesay

docker pull dokcer/whalesay

docker run dokcer/whalesay cowsay docker is fun

docker tag dokcer/whalesay forezp/whalesay

dcoker push forezp/whalesay

docker login

Docker Compose

docker compose是Docker 官方的一个容器编排工具,现在以一个简单的搭建博客的例子来讲解。

安装

所以的例子都是在linux系统下完成的,docker compose在linux下的安装:

1
2
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

验证安装成了没:

1
docker-compose --version

Docker Compse常用命令

  • docker-compose build
  • docker-compose up
  • docker-compose stop
  • docker-compose rm

案例实战

工程架构:

image.png

分为3个容器,最外层一个服务为ngixn,下一层服务为ghost app,最底层容器是Mysql

在工作目录ghost下,有三个文件夹分别为ngix、ghost、db和一个docker-compose.yml文件,目录结构为:

1
2
3
4
5
6
7
8
9
-ghost
 - nginx
     - Dockerfile
     - nginx.conf
 - ghost
   - Dockerfile
     - config.js
 - db
 - docker-compose.yml

docker-compose.yml编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '2'
networks:
  ghost:
services:
  ghost-app:
    build: ghost
    networks:
      - ghost
    depends_on:
      - db
    ports:
      - "2368:2368"
  nginx:
     build: nginx
     networks:
      - ghost
     depends_on:
      - ghost-app
     ports:
      - "80:80"
  db:
    image: "mysql:5.7.15"
    networks:
      - ghost
    environment:
      MYSQL_ROOT_PASSWORD: mysqlroot
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    volumes:
      - $PWD/data:/var/lib/mysql
    ports:
      - "3306:3306"

nginx相关

dockerfile编写:

1
2
3
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

配置文件文件编写nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
worker_processes 4;
events {
        worker_connections 1024;
        }
http {
    server {
       listen 80;
       location / {
             proxy_pass http://ghost-app:2368;
        }
    }
}

ghost app相关

Dockerfile编写:

1
2
3
FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368

配置文件config.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var path = require('path'),
config;
config = {
  production: {
    url: 'http://mytestblog.com',
    mail: {},
    database: {
       client: 'mysql',
       connection: {
         host: 'db',
         user: 'ghost',
         password: 'ghost',
         database: 'ghost',
         port: '3306',
         charset: 'utf8'
       },
      debug: false
    },
    paths: {
       contentPath: path.join(process.env.GHOST_CONTENT,'/')
     },
     server: {
        host: '0.0.0.0',
        port: '2368'
     }
   }
};
module.exports = config;

docker-compose打镜像,打完镜像之后运行.

1
2
docker-compose buid
docker-compose up

运行之后在浏览器上访问:http://119.23.221.204/

显示界面如下:

image.png

代码位置

/usr/dockerstudy/ghost

常用命令

  • docker stop $(docker ps -q) & docker rm $(docker ps -aq) 删除所有容器

参考资料

https://www.imooc.com/video/15735

  • 关注我的公众号,精彩内容不能错过!

forezp.jpg


欢迎关注我的公众号

扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客

本文为[原创]文章,转载请标明出处。
本文链接:https://www.fangzhipeng.com/docker/2018/09/12/docker-action/
本文出自方志朋的博客
阿里云1023 腾讯云1023