华为云上配置docker
最近华为云与牛客做活动,只要9块钱就可以获得一年的服务器,真心觉得太棒了,大爱牛客!
环境:
服务器:华为云centos7
Docker与传统虚拟化方式
虚拟机缺点:
- 资源占用多
- 冗余步骤多
- 启动慢
不同之处:
- 传统虚拟化技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上在运行所需应用进程
- 而容器内得应用进程直接运行于宿主得内核,容器没有自己得内核,而且也没有进行硬件虚拟。因此要比传统虚拟机更为轻便
优势:
- 轻量,秒级得快速启动速度
- 简单,易用,活跃的社区
- 标准统一的打包/部署/运行方案
- 镜像支持增量分发,易于部署
- 易于构建,良好的REST API,也很适合自动化测试和持续集成
- 性能,尤其是内存和IO的开销
(Centos下仅支持6.5以上的版本)
Docker三要素
- (类模板)镜像(image):一个只读模板。镜像可以来创建Docker容器,一个镜像可以创建很多容器。
- (对象实例)容器(container):看作是一个简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等) 和运行在其中的应用程序
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一的区别在于容器的最上面那一层是可读可写的。
- 仓库(repository):集中存放镜像文件的场所。
Centos7安装Docker
#卸载旧版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo yum install docker-ce docker-ce-cli containerd.io systemctl start docker
配置阿里镜像
mkdir -p /etc/docker vim tee /etc/docker/daemon.json #编写文本如下 { "registry-mirrors": ["https://we9yfuxn.mirror.aliyuncs.com"] } systemctl daemon-reload systemctl restart docker
运行一个hello world镜像
docker run hello-world
运行的整个过程类似于maven的工作过程,现在本地找,然后去远程docker仓库查找
运行底层原理
Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器是一个运行时的环境。
基本指令
帮助命令
#查看版本信息 docker version #具体信息 docker info #查看命令 docker --help
镜像命令
#查看本地镜像 docker images #查找镜像[列出收藏数不小于指定值的镜像]] docker search [-s number] <name> #拉取镜像 docker pull <name> #删除镜像 docker rmi [-f] <ID1> [<iD2>...] #删除全部镜像 docker rmi -qa
容器命令
#启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] #OPTIONS说明 #--name='容器新名字':为容器指定一个名称 #-d:后台运行容器,并返回容器ID,也即启动守护式容器(如果没有可交互的前端,会自动退出) #-i:以交互式模式运行容器,通常与-t同时运行 #-t:为容器重新分配一个伪输入终端,通常与-i同时使用 #列出当前所有正在运行的容器 docker ps #容器推出 exit #容器停止退出 ctrl+P+Q #容器不停止退出 #启动容器 docker start <name> #重启容器 docker restart <name> #停止容器,缓慢停止 docker stop <name> #强制停止 docker kill <name> #删除已经停止的容器 docker rm [-f] <name> #-f 强制关闭并删除 #查看容器日志 docker logs -f -t --tail <name> #-t 时间戳 #-f 跟随最新的日志打印 #--tail <number> 显示最后多少条 #查看容器内进程 docker top <name> #查看容器内部细节 docker inspect <name> #重新进入容器并以命令行交互 docker attach <name> #不用进入容器 docker exec -t <name> <bashShell> #将容器内的文件拷贝到主机上 docker cp <name>:<容器内路径> <目的主机路径> #映射docker镜像端口<port2>到主机端口<port1> docker run -it -p <port1>:<port2> <name> #随机映射端口 docker run -it -P <name> #提交 docker commit
容器数据卷
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
容器卷如果设置只读权限,就只能主机到docker的单向传递,禁止容器内对文件的修改
DockerFile添加
根目录下新建mydocker文件夹并进入
可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷
File构建
- 编写dockfile文件
FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,----------------success1" CMD /bin/bash
- 编写dockfile文件
build后生成镜像
docker build -f /mydocker/dockerfile -t chase/centos .
run容器
docker run -it chase/centos
可以通过 docker inspect指令来查看主机文件夹位置
Mounts": [ { "Type": "volume", "Name": "80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625", "Source": "/var/lib/docker/volumes/80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625/_data", "Destination": "/dataVolumeContainer2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" },
可以看出文件夹位置是 /var/lib/docker/volumes/80ff2bad3416d0a21727d1c652aec78c0d9150b613a914ba9a7a65339d1f2625/对应/dataVolumeContainer2
容器间数据卷共享
#启动一个父容器 docker run -it --name dc01 chase/centos docker run -it --name dc02 --volumes-from dc01 chase/centos docker run -it --name dc03 --volumes-from dc01 chase/centos
由上文可以知道,创建chase/centos的时候会创建容器数据卷,所以dc01,dc02,dc03都各自有两个容器数据卷,且这两个容器数据卷在三个容器中均是同步的,例如:在dc01中创建文件 dc01.txt 在其余两个容器中也会有 dc01.txt 文件。即使关闭dc01容器,同步过程依然存在
DockerFile解析
语法
- 每条保留字指令都必须为大写字母且后面都跟随至少一个参数
- 指令按照从上到下,顺序执行
- # 表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
docker三个阶段
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行状态
DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维
DockerFile体系结构
1. FROM
基础镜像,当前镜像是基于哪个镜像的
2. MAINTAINER
镜像维护者的姓名与邮箱地址
3. RUN
容器构建时需要运行的命令
4. EXPOSE
当前容器对外暴露出的端口
5. WORKDIR
指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
6. ENV
用来构建镜像过程中设置环境变量(key-value键值对)
7. ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
8. COPY
类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径> 的文件/目录复制到新的一层的镜像内的<目标路径> 位置
9. VOLUME
容器数据卷,用于数据保存和持久化工作
10. CMD
指定一个容器启动时要运行的命令。DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
11. ENTRYPOINT
指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
12. ONBUILD
带构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后父镜像的build被触发
自定义镜像
基础知识
Base镜像(scratch)-Docker Hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
- 编写:编写DockerFile文件
- 构建
docker build -t 新镜像名字:TAG .
- 运行
docker run -it 新镜像名字:TAG
案例
使centos镜像支持vim,默认进入位置为 /usr/local并且支持ifconfig
文件路径: /mydocker/ 下 dockerfile2 文件
FROM centos ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success-----------ok" CMD /bin/bash
构建:
docker build -f /mydocker/dockerfile2 -t mycentos:1.3 .
运行:
docker run -it mycentos:1.3
使用
mysql
#启动mysql docker run -p 12345:3306 --name mysql -v /chase/mysql/conf:/etc/mysql/conf.d -v /chase/mysql/logs -v /chase/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
说明:映射到3306,并建立两个容器数据卷,方便修改配置和查看日志,以密码123456启动
#导出数据库 docker exec <id> sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /chase/all-databases.sql
说明:exec使不进入docker就执行命令,将所有数据库导出到本机的/chase/all-databases.sql 中