慕课网《Docker入门》学习总结
时间: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与虚拟机
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架构
学习笔记
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介绍:容器、镜像
如何制作镜像
如何分享镜像
如何持久化容器数据
如何编排一个多容器的应用