6

时间:2017年09月16日星期六
说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com
教学源码:无
学习源码:无

第一章:课程简介

1-1 课程介绍

Docker入门教程

Docker简介:什么是Docker
镜像与容器
容器存储
Registry
多容器app

面向用户

对docker感兴趣的开发、测试、运维

预备知识

linux命令行
bash shell脚本

1-2 Docker介绍

什么是Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,
然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。

与现有技术进行类比

可以粗糙地理解为轻量级的虚拟机
开挂的chroot(chroot:对应用程序作了文件系统的分离)

Docker与虚拟机

clipboard.png

1-3 Mac安装

学习笔记

进入docker官网:www.docker.com
下载docker安装包:Docker.dmg

打开docker
open Docker.dmg
或双击Docker.dmg
将Docker拖到Applications里面

验证安装
docker info

1-4 Linux安装

学习笔记

安装docker本身
sudo wget -qO- https://get.docker.com/ | sh
允许非root用户运行docker
sudo usermod -aG docker zc
验证安装
docker info

1-5 Windows安装

学习笔记

官网地址:https://www.docker.com/
下载安装包:https://www.docker.com/docker-windows
执行安装包:Docker for Windows Installer.exe

第二章:Docker架构

2-1 架构介绍

Docker架构

clipboard.png

clipboard.png

学习笔记

docker run ubuntu echo hello docker
 使用ubuntu镜像,在里面运行了echo hello docker这个命令,输出就是hello docker
 
docker run nginx

docker images
查看本地镜像

docker run -p 8080:80 -d daocloud.io/nginx
运行daocloud.io/nginx镜像
-p 端口映射,将nginx的80端口映射到本地的8080端口
-d 使用守护进程启动

docker ps
查看当前正在运行的容器


docker cp index.html 容器ID:容器内部文件路径
docker cp index.html 17asdasdasa://usr/share/nginx/html
将index.html文件拷贝到容器ID为17asdasdasa容器内部,路径为//usr/share/nginx/html

docker stop 容器ID
停止指定容器

docker commit -m 'fun' 容器ID nginx-fun
保存容器为镜像,镜像名为nginx-fun

docker rmi 镜像ID
删除指定镜像

docker ps -a
查看所有容器(正在运行和停止运行)

docker rm 容器ID
删除指定容器

docker pull
获取镜像

docker build
创建镜像

docker images
列出镜像

docker run
运行镜像为容器

docker ps
列出正在运行的容器

docker rm
删除容器

docker rmi
删除镜像

docker cp
在主机和容器之间拷贝文件

docker commit
保存改动后的容器为新的image

第三章:Dockerfile

3-1 Dockerfile介绍

学习笔记

第一个Dockerfile

FROM alpine:latest
MAINTAINER zc
CMD echo 'hello docker'

// 依赖于基础镜像alpine:latest
// 标识镜像信息
// 需要运行的命令

touch Dockerfile
产生一个Dockerfile文件
vim Dockerfile
编辑Dockerfile文件

docker build -t hello_docker .
构建docker镜像,-t参数指定镜像名称,最后面的点(.)表示构建镜像文件的路径

docker images
docker run hello_docker

3-2 Dockerfile实战

学习笔记

第二个Dockerfile

FROM ubuntu
MAINTAINER zc
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","deamon off;"]
EXPOSE 80

// 依赖于基础镜像ubuntu
// 标识镜像信息
// 运行ubuntu命令,新增一个软件仓库镜像地址
// 运行ubuntu命令,更新软件
// 运行ubuntu命令,安装nginx
// 拷贝本地文件到镜像内部
// 在镜像中默认启动nginx服务
// 镜像暴露服务的端口

mkdir dockerfile2
cd dockerfile2
touch Dockerfile
vim Dockerfile
touch index.html
vim index.html
今天是周末!

docker build -t zc/hello-nginx .

docker run -d -p 80:80 zc/hello-nginx

curl http://localhost
使用curl进行测试

Dockerfile语法

FROM:指明基础镜像名称。必填
RUN:用于执行命令,当RUN执行完毕后,将产生一个新的文件层。可选
ADD:向镜像添加新文件或者新目录。可选
COPY:从主机向镜像复制文件。可选
CMD:指定此镜像启动时默认执行命令。可选
EXPOSE:用于指定需要暴露的网络端口号。可选
WORKDIR:设定此镜像后续操作的默认工作目录。可选
MAINTAINER:可用于提供作者、版本及气他备注信息。可选
ENV:用于在镜像中添加环境变量。可选
ENTRYPOINT:在镜像中设定默认执行的二进制程序。可选
USER:在镜像构建过程中,生成或者切换到另一个用户。可选
VOLUME:向镜像中挂载一个卷组。可选

3-3 镜像分层

镜像分层

Dockerfile中的每一行都产生一个新层
FROM alpine:latest        4dffsd5454wq
MAINTAINER zc        fbdfasdfasfd554
CMD echo 'hello docker'    3df545dfad4a

第四章:Docker存储

4-1 Volume介绍

Volume

提供独立于容器之外的持久化存储

4-2 Volume操作

学习笔记

第一种形式

docker run -v 容器内部地址 镜像名称
docker run -d --name nginx -v /usr/share/nginx/html nginx
运行nginx容器,通过-v挂载一个卷组,通过-d后台启动,通过--name为容器指定名称

docker inspect 容器名称
docker inspect nginx
查看指定容器所有信息

查看Mounts节点下的Sources节点和Destination节点信息
该容器把宿主机的Sources对应目录挂载到容器内部的Destination的目录地址

cd Sources对应的目录路径
vim index.html,修改index.html文件

docker exec -it 容器名称 /bin/bash
进入到容器内部

cd Destination对应的路径路径
然后查看index.html文件,发现是刚刚修改后的内容,即挂载成功,映射关系正确

第二种形式

docker run -v $PWD/code:/var/www/html nginx
本地目录挂载到容器里面的一个路面里面
docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx

cat html/index.html
查看本地文件的内容

docker exec -it 容器名称 /bin/bash
进入到容器内部

cat /usr/share/nginx/html/index.html
发现其内容和本地文件的内容一致,即映射关系正确

第二种形式

docker run --volumes-from ...

mkdir data
docker create -v $PWD/data:/var/mydata --name data_container ubuntu
产生一个仅有数据的容器

docker run -it --volumes-from data_container ubuntu /bin/base
从另外一个容器挂载, 运行并直接进入容器内部

mount
cd mydata
touch whatever.txt
exit

cd data
ls
查看本地data目录下是否有whatever.txt文件
可以多个容器挂载一个数据容器,实现数据共享

第五章:镜像仓库

5-1 Registry介绍

Docker相关术语

host:宿主机
image:镜像
container:容器
registry:镜像仓库
daemon:守护程序
client:客户端

Registry相关命令

docker search 镜像名称
从镜像仓库中搜索指定镜像
docker pull 镜像名称
从镜像仓库中拉取指定镜像
docker push 镜像名称
将本地镜像推送到镜像仓库

国内的一些镜像仓库

daocloud
时速云
阿里云

5-2 Registry实战

学习笔记

docker search whalesay
在镜像仓库中搜索whalesay

docker pull docker/whalesay
从镜像仓库中拉取镜像docker/whalesay到本地

docker images
查看本地镜像信息

docker run docker/whalesay cowsay Docker so fun
运行docker/whalesay镜像,并指定参数

docker tag docker/whalesay zc/whalesay
依赖docker/whalesay镜像产生新的zc/whalesay镜像(类似复制)

docker push zc/whalesay
将镜像zc/whalesay推送到镜像仓库

docker login
在push之前,需要登录。默认登录到docker hub

到docker hub官方地址
查看到自己push的镜像

第六章:多容器app

6-1 Compose介绍

docker-compose

多容器app
docker-compose是独立的软件
docker-compose安装
linux:curl https://github.com/docker/compose

6-2 Compose安装

学习笔记

curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
下载docker-compose包到/usr/local/bin/docker-compose

chmod a+x /usr/local/bin/docker-compose
给/usr/local/bin/docker-compose授可执行权限

docker-compose --version
验证安装

6-3 Compose实战

实战案例介绍

app名称:ghost,是一个博客平台程序
安装之后,可自己写文章或别人发布
架构:nginx-ghost app-mysql
分别分为三个容器

docker-compose.yml文件

ghost-app: 
  build: ghost
  depends_on: 
    - db
  ports: 
    - "2368:2368"
nginx: 
  build: nginx
  ports: 
    - "80:80"
  depends_on: 
    - ghost-app
db: 
  images: "mysql:5.7.15"

docker-compose.yml命令

build:本地创建镜像
command:覆盖缺省命令
depends_on:连接容器
ports:暴露端口
volumes:挂载卷组
image:拉取镜像

docker-compose命令

up:启动服务
stop:停止服务
rm:删除服务中的各个容器
logs:观察各个容器中的日志
ps:列出服务相关的容器

学习笔记

mkdir ghost
cd ghost

mkdir ghost
mkdir nginx
mkdir data

// ghost镜像构建
cd ghost
touch Dockerfile
vim Dockerfile

FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
CMD ["npm","start","--production"]

// 依赖ghost官方镜像
// 拷贝本地配置文件到镜像中
// 声明暴露服务的端口
// 执行启动命令。ghost为node.js程序,所以使用npm命令

touch config.js
vim 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;

// nginx镜像构建
cd nginx

touch Dockerfile
vim Dockerfile

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

// 依赖nginx官方镜像
// 拷贝本地配置文件到镜像中
// 声明暴露服务的端口

touch nginx.conf
vim nginx.conf

worker processes 4;
events {worker_connections 1024;}
http {
    server {
        listen 80;
        location / {
            proxy_pass http://ghost-app:2368;
        }
    }
}

回到ghost根路径
ls显示
ghost:存放Dockerfile和配置文件用来构建镜像
nginx:存放Dockerfile和配置文件用来构建镜像
data:存放博客的数据

// compose文件用于描述整个系统的架构
touch docker-compose.yml
vim docker-compose.yml

version: '2'

networks: 
  ghost: 

service: 
  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"


docker-compose up -d
启动
docker-compose stop
关闭
docker-compose rm
删除

docker-compose build
构建


访问http://localhost/ghost

第七章:课程总结

7-1 课程总结

课程总结

Docker介绍:容器、镜像
如何制作镜像
如何分享镜像
如何持久化容器数据
如何编排一个多容器的应用

妙手空空
1.3k 声望370 粉丝

博观而约取,厚积而薄发