Docker入门与实践

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安装:

安装:

yum search docker

yum -y install docker-io

查看基本信息:docker info

启动:servie start docker

Docker架构

Docker入门与实践_第1张图片

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

常见的Docker命令

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

常用命令

命令用途

WORKDIRRUN ENTRYPINT CMD执行的工作目录

ENV添加环境变量

ADD添加文件,会解压压缩包

COPY复制文件

ONBUILD触发器

VOLUME挂载卷

FROM基础镜像

ENTRYPOINT基础命令

RUN执行命令

CMD启动程序命令,拼接在基础命令后

EXPOSE暴露端口

MAINTAINER维护者

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

第一个Dockerfile

FROM alpine:latest

MAINTAINER fzp

CMD echo 'hello docker'

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

执行:

docker build -t hello-img .

docker run hello-img

控制台输出: hello docker

第二个Dockerfile

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

today i'm happy

执行命令:

docker build -t forezp/hello.nginx .

docker run forezp/hello.nginx

curl localhost

控制台输出:today i'm happy

Docker存储

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

第一种方式:

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

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

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

第二种方式:

docker run -volumes-from ...

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。

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下的安装:

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

验证安装成了没:

docker-compose --version

Docker Compse常用命令

docker-compose build

docker-compose up

docker-compose stop

docker-compose rm

案例实战

工程架构:

Docker入门与实践_第2张图片

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

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

-ghost

- nginx

    - Dockerfile

    - nginx.conf

- ghost

  - Dockerfile

    - config.js

- db

- docker-compose.yml

docker-compose.yml编写

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编写:

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

配置文件文件编写nginx.conf

worker_processes 4;

events {

       worker_connections 1024;

       }

http {

   server {

      listen 80;

      location / {

            proxy_pass http://ghost-app:2368;

       }

   }

}

ghost app相关

Dockerfile编写:

FROM ghost

COPY ./config.js /var/lib/ghost/config.js

EXPOSE 2368

配置文件config.js:

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打镜像,打完镜像之后运行.

docker-compose buid

docker-compose up

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

显示界面如下:

Docker入门与实践_第3张图片



源网络,版权归原创者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。


更多技术,欢迎关注下方公众号

你可能感兴趣的:(Docker入门与实践)