867-Docker入门
https://www.imooc.com/learn/867
简介:本课程从最基础的安装开始,通过大量的实际操作循序渐进地介绍Docker基本知识。从最基本的镜像、容器开始,学习Dockerfile编写,容器操作,到完成一个多容器的应用。
第1章 课程简介
介绍Docker以及安装方式
1-1 课程介绍
Docker简介:
Docker是容器技术的代表。
容器技术本质上是将程序隔离、打包的一个技术。
解决问题:
解决软件包安装的问题
理顺了开发与运维环境的差异,使开发和运维可以使用同一种语言进行沟通
Docker入门教程
Docker简介:什么是Docker
镜像与容器
容器存储
Registry
多容器app
面向用户
对docker感兴趣的。开发、测试、运维
预备知识
linux命令行
bash shell脚本
1-2 Docker介绍
什么是Docker
Docker: an open source project to pack, ship and run any application as a lightweight container.
是一个开源的项目,可以使任何应用以轻量级的形式打包、发布和运行Node. js: allows to package an application with all of its dependencies into a standardized unit.
允许一个应用程序及其所有依赖以一种标准的单位来进行打包
Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,
然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
与现有技术进行类比
可以粗糙地理解为轻量级的虚拟机
开挂的chroot(chroot:对应用程序作了文件系统的分离)
Docker与虚拟机:

注:
- 左边为虚拟机,右边为Docker
- Hypervisor层:虚拟出硬件
- Guest OS:硬件上安装完全独立的Guest OS
- Docker Engine:利用Namespace、Control Group将应用程序分离
- Docker没有Hypervisor虚拟层,会轻量很多
1-3 docker mac安装
下载
官网地址:https://www.docker.com/
下载安装包:https://www.docker.com/docker-windows安装
打开docker
open Docker.dmg或双击Docker.dmg
将Docker拖到Applications里面验证安装:docker info
配置
镜像加速:
【Preferences…】=>【Advanced】=>【Registry mirrors】
1-4 docker linux安装
## Ubuntu
# 安装docker本身
sudo wget -qO- https://get.docker.com | sh
# 允许非root用户运行docker
sudo usermod -aG docker tyk
# 验证安装
docker info
注:
- -q:标识输出要简单
- O-:标识标准输出,而不是输出到文件
## CentOS7
# 系统 CentOS-Extras 库中已带 Docker,可以直接安装:
sudo yum install docker
# 安装之后启动Docker服务,并让它随系统启动自动加载。
sudo service docker start
sudo chkconfig docker on
1-5 docker windows安装
下载
官网地址:https://www.docker.com/
下载安装包:https://www.docker.com/docker-windows安装
执行安装包:Docker for Windows Installer.exe
验证安装:docker info
配置
镜像加速:
【settings】=>【Daemon】=>【Registry mirrors】
第2章 实践第一步
创建第一个Hello world
2-1 docker架构介绍与实战
Docker架构:


使用ubuntu镜像,在里面运行了echo hello docker这个命令,输出就是hello docker
docker run ubuntu echo hello docker
运行NGINX服务器:
docker run nginx
查看本地镜像:
docker images
运行daocloud.io/nginx镜像:
docker run -d -p 8080:80 daocloud.io/nginx
注:
- -d:使用守护进程启动
- -p:端口映射,将nginx的80端口映射到本地的8080端口
查看当前正在运行的容器:
docker ps
显示Docker相关信息的页面:
# 将文件拷贝到Docker容器。
# 将index.html文件拷贝到容器ID为17asdasdasa容器内部,路径为//usr/share/nginx/html
# docker cp 文件 容器ID:容器内部文件路径
docker cp index.html 17add7bbc58c://usr/share/nginx/html
停止指定容器:
docker stop 容器ID
Docker在容器内的改动都是暂时的,没有被保存
#
# 保存容器为镜像,镜像名为nginx-fun
docker commit -m 'fun' 容器ID nginx-fun
删除指定镜像:
docker rmi 镜像ID
查看所有容器(正在运行和停止运行):
docker ps -a
删除指定容器:
docker rm 容器ID
命令小结:
命令 | 用途 |
---|---|
docker pull | 获取image |
docker build | 创建image |
docker images | 列出image |
docker run | 运行container |
docker ps | 列出正在运行的container |
docker rm | 删除container |
docker rmi | 删除image |
docker cp | 在host和container之间拷贝文件 |
docker commit | 保存改动为新的image |
第3章 Dockerfile介绍
编写dockerfile
3-1 dockerfile介绍
通过编写简单的文件自创docker镜像
第一个Dockerfile:
FROM alpine:latest
MAINTAINER tyk 766564616@qq.com
CMD echo 'hello docker'
注:
- 依赖于基础镜像alpine:latest
- 标识镜像信息
- 需要运行的命令
mkdir dockerfile1
cd dockerfile1
# 产生一个Dockerfile文件
touch Dockerfile
# 编辑Dockerfile文件
vim Dockerfile
# 构建docker镜像
docker build -t hello_docker .
# 查看已安装Docker镜像
docker images hello_docker
# 运行Docker镜像
docker run hello_docker
注:
- -t:参数指定镜像名称
- 最后面的点(.)表示构建镜像文件的路径
3-2 dockerfile实战
第二个Dockerfile:
# 依赖于基础镜像ubuntu
FROM ubuntu
# 标识镜像信息
MAINTAINER tyk 766564616@qq.com
# 运行ubuntu命令,新增一个软件仓库镜像地址
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 运行ubuntu命令,更新软件
RUN apt-get update
# 运行ubuntu命令,安装nginx。-y:默认yes不询问
RUN apt-get install -y nginx
# 拷贝本地文件到镜像内部
COPY index.html /var/www/html
# 将NGINX在前台启动
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
# 镜像暴露服务的端口
EXPOSE 80
mkdir dockerfile2
cd dockerfile2
touch Dockerfile
vim Dockerfile
touch index.html
vim index.html
docker build -t 766564616/hello-nginx .
docker run -d -p 80:80 766564616/hello-nginx
使用curl进行测试
curl http://localhost
Dockerfile语法:
命令 | 用途 | 说明 | 是否必填 |
---|---|---|---|
FROM | base_image | 指明基础镜像名称。 | 必填 |
RUN | 执行命令 | 用于执行命令,当RUN执行完毕后,将产生一个新的文件层。 | 可选 |
ADD | 添加文件 | 向镜像添加文件。可以添加远程文件 | 可选 |
COPY | 拷贝文件 | 从主机向镜像复制文件。 | 可选 |
CMD | 执行命令 | 指定此镜像启动时默认执行命令。容器执行入口 | 可选 |
EXPOSE | 暴露端口 | 用于指定需要暴露的网络端口号。 | 可选 |
WORKDIR | 指定路径 | 设定此镜像后续操作的默认工作目录。 | 可选 |
MAINTAINER | 维护者 | 可用于提供作者、版本及气他备注信息。 | 可选 |
ENV | 设定环境变量 | 用于在镜像中添加环境变量。 | 可选 |
ENTRYPOINT | 容器入口 | 在镜像中设定默认执行的二进制程序。容器执行入口 | 可选 |
USER | 指定用户 | 在镜像构建过程中,生成或者切换到另一个用户。 | 可选 |
VOLUME | mount point | 向镜像中挂载一个卷组。 | 可选 |
3-3 镜像分层
Dockerfile中的每一行都产生一个新层
FROM alpine:latest 4dffsd5454wq
MAINTAINER tyk766564616 fbdfasdfasfd554
CMD echo 'hello docker' 3df545dfad4a
每个命令都是单独保存的一层。只有容器层是RW,镜像中的各层都是RO
分层的好处:假如有很多container或者很多的Image,相同的镜像层会复用共享。一定程度上减小了储存空间的使用,运行起来方便。
第4章 存储
对volume进行介绍
4-1 volume介绍
提供独立于容器之外的持久化存储
应用场景:
比如数据库,可以将数据存储在容器外的分卷。
可以提供容器跟容器之间的数据共享。
4-2 volume操作
第一种形式:
Docker虚拟路径挂载到容器里面的路径
docker run -v 容器内部地址 镜像名称
# 运行nginx容器,通过-v挂载一个卷组
docker run -d --name nginx -v /usr/share/nginx/html nginx
# 查看指定容器信息
# docker inspect 容器名称
docker inspect nginx
# 查看Mounts节点下的Sources节点和Destination节点信息
# 该容器把宿主机的Sources对应目录挂载到容器内部的Destination的目录地址
cd Sources对应的目录路径
# 修改index.html文件
echo "it's 2016" > index.html
# 进入到容器内部
# docker exec -it 容器名称 /bin/bash
docker exec -it nginx /bin/bash
# cd Destination对应的路径路径
# 查看index.html文件
cat index.html
# 打印出刚刚修改后的内容,即挂载成功,映射关系正确
第二种形式:
本地目录挂载到容器里面的路径
docker run -v $PWD/code:/var/www/html nginx
docker run -d -p 80:80 -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 卷容器ID
好处:
可以多个容器挂载一个数据容器,实现数据共享
mkdir data
# 产生一个仅有数据的容器
docker create -v $PWD/data:/var/mydata --name data_container ubuntu
# 从另外一个容器挂载, 运行并直接进入容器内部
docker run -it --volumes-from data_container ubuntu /bin/base
mount
touch /var/mydatawhatever.txt
exit
# 查看本地data目录下是否有whatever.txt文件
ls data
第5章 镜像仓库
registry介绍与实战
5-1 registry介绍
Docker相关术语:
English | 中文 |
---|---|
host | 宿主机 |
image | 镜像 |
container | 容器 |
registry | 镜像仓库 |
daemon | 守护程序 |
client | 客户端 |
Registry相关命令:
# 从镜像仓库中搜索指定镜像
docker search image_name
# 从镜像仓库中拉取指定镜像
docker pull image_name
# 将本地镜像推送到镜像仓库
docker push image_name
国内的一些镜像仓库:
daocloud
时速云
阿里云
5-2 registry实战
# 在镜像仓库中搜索whalesay
docker search whalesay
# 从镜像仓库中拉取镜像docker/whalesay到本地
docker pull docker/whalesay
# 查看本地镜像信息
docker images
# 运行docker/whalesay镜像,并指定参数
docker run docker/whalesay cowsay Docker so fun
# 在push之前,需要登录。默认登录到docker hub
docker login
# 依赖docker/whalesay镜像产生新的766564616/whalesay镜像(类似复制)
docker tag docker/whalesay 766564616/whalesay
# 将镜像766564616/whalesay推送到镜像仓库
docker push 766564616/whalesay
# 到dockerhub官方地址,查看到自己push的镜像
# https://hub.docker.com/
第6章 多容器app
介绍多容器app与实例
6-1 compose介绍
多容器app
编写文本文件,文件描述多容器APP的结构然后通过工具docker-compose把它拉起来
docker-compose是独立的软件
docker-compose安装:
Mac/Windows:自带
Linux:curl https://github.com/docker/compose
6-2 compose-install-linux
https://github.com/docker/compose/releases
# 下载docker-compose包到/usr/local/bin/docker-compose
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/docker-compose
# 给/usr/local/bin/docker-compose授可执行权限
chmod +x /usr/local/docker-compose
# 验证安装
docker-compose --version
uname -s
# Linux
$ uname -m
# x86_64
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"
实战操作:
# ghost根路径
mkdir ghost
cd ghost
# 存放Dockerfile和配置文件用来构建镜像
mkdir ghost
mkdir nginx
# 存放博客的数据
mkdir data
ghost镜像构建
# /ghost # ghost镜像构建 cd ghost touch Dockerfile vim Dockerfile ... touch config.js vim config.js ...
### Dockerfile ### # 依赖ghost官方镜像 FROM ghost # 拷贝本地配置文件到镜像中 COPY ./config.js /var/lib/ghost/config.js # 声明暴露服务的端口 EXPOSE 2368 # 执行启动命令。ghost为node.js程序,所以使用npm命令 CMD ["npm","start","--production"]
<!-- 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镜像构建
# /ghost cd nginx touch Dockerfile vim Dockerfile ... touch nginx.conf vim nginx.conf ...
### Dockerfile ### # 依赖nginx官方镜像 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; } } }
准备compose文件,用于描述整个系统的架构
# /ghost touch docker-compose.yml vim 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: 123456 MYSQL_USER: ghost MYSQL_PASSWORD: ghost volumes: - $PWD/data:/var/lib/mysql ports: - "3306:3306"
拉起系统
# /ghost # 启动 docker-compose up -d # 关闭 docker-compose stop # 删除 docker-compose rm # 构建 docker-compose build
6-4 章节回顾
docker-compose.yml常用命令:
命令 | 用途 |
---|---|
build | 本地创建镜像 |
command | 覆盖缺省命令 |
depends_on | 连接容器,服务依赖 |
ports | 暴露端口 |
volumes | 挂载卷组 |
image | 拉取镜像 |
docker-compose命令:
命令 | 用途 |
---|---|
up | 启动服务 |
stop | 停止服务 |
rm | 删除服务中的各个容器 |
logs | 观察各个容器中的日志 |
ps | 列出服务相关的容器 |
第7章 总结
课程总结
7-1 课程总结
Docker介绍:容器、镜像
如何制作镜像
如何分享镜像
如何持久化容器数据
如何编排一个多容器的应用
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 tuyrk@qq.com
文章标题:867-Docker入门
文章字数:3.5k
本文作者:神秘的小岛岛
发布时间:2019-06-29, 21:48:19
最后更新:2019-11-05, 16:42:45
原始链接:https://www.tuyrk.cn/imooc/867-Docker/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。