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与虚拟机

注:

  • 左边为虚拟机,右边为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安装

第2章 实践第一步

创建第一个Hello world

2-1 docker架构介绍与实战

Docker架构:

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
  1. 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;
  2. 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;
            }
        }
    }
  3. 准备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"
  4. 拉起系统

    # /ghost
    # 启动
    docker-compose up -d
    # 关闭
    docker-compose stop
    # 删除
    docker-compose rm
    # 构建
    docker-compose build
  5. 访问http://localhost、http://localhost/ghost

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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏