背景:从上次和白千大佬聊天得知Docker的重要后,LyuLumos大佬搭建的CUC-OJ也用到了传说中的Docker。为了能听懂他们在说什么...赶紧过来了解下皮毛。
(在爬了,在爬了.jpg)
零:前置知识
- Linux命令和背景知识 Linux命令大全
- 了解仓库Git等使用(Docker Hub / Github)
一:什么是Docker
从图标形象来看
- 大海(宿主机)
- 鲸鱼(Docker)
- 背上的箱子(容器实例)(来自镜像模板)
- docker出现的原因:解决开发和运维工程师(部署)的矛盾,根本原因是环境和配置的改变。
- 解决方法:使软件和环境一起安装,将代码,配置,系统数据一起打包给运维。
- Docker的理念:“一次封装,次次运行”,解决运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟技术。
Docker 和 VM的不同:
- VM模拟出完整的系统,硬件也模拟了(慢,占内存..)
- Docker只模拟新需要的库资源和设置(轻量级)
二:Docker 安装
镜像 / 容器 / 仓库(存放镜像) Docker Hub
#举例:CentOS 6.8
yum install -y epel-release
yum install -y docker-io
service docker start
加速:阿里云 / 网易云
永远的HelloWorld
三:Docker 的命令
终于明白什么是镜像和容器了0.0
- 下载的是镜像,也就是模板,别人写好的代码
- 用一个镜像可以创建很多个容器(运行的)
1. 镜像命令
# 列表显示已有的镜像模板
docker images <-a> <-q> <-qa> <--digests>
# search(以Tomcat镜像为例)
docker search <-s num> <--no-trunc> <--automated> [tomcat..]
# 下载镜像(以Tomcat镜像为例)
docker pull [tomcat...]
# 删除某个镜像(以Tomcat镜像为例)
docker rmi <-f> [tomcat...]
docker rmi -f $(docker images -qa)
2. 容器命令
(1) 基本操作
# 新建并启动容器
docker run <tag> IMAGE [COMMAND]
-it 启动交互式容器+伪终端
举例:
docker run -it --name yxttomcat tomcat
# 退出容器
exit / (Ctrl + D) # 容器停止退出
Ctrl + P + Q # 暂离
# 暂离后进入
docker attach id
# 不进入宿主机也可以对容器进行操作
docker exec -t id 操作的命令
# 查看容器运行情况
docker ps
docker ps -l
docker ps -a
# 重启容器
docker restart id
# 停止容器
docker stop / kill
# 删除某个容器
docker rm id
docker rm -f id # 没停止时强制删除
# 删除多个容器
docker rm -f $(docker ps -qa)
docker ps -a -q | xargs docker rm
(2) 其他命令
# 保护式启动容器
docker run -d IMAGE
(此时如果没有前台进程,会自动关闭,也就是ps后没有结果)
docker run -d centos /bin/sh -c "while true;do echo hello yxt;sleep 3;done"
(可以通过docker logs -t id 查看进程,ps 后也仍然存在)
# 查看容器运行日志
docker logs -t -f --tail 3 id
# 查看容器内运行的进程
docker top id
# 查看容器信息
docker inspect id
# 从容器内拷贝文件到主机上
docker cp id 待拷贝路径 拷贝到哪里
四:Docker 镜像
独立软件包 UnionFS(对文件系统的修改作为一次提交来一层一层叠加)
# 提交容器副本使之成为一个新镜像
docker commit
举例:下载Tomcat镜像,生成一个容器,更改运行实例成为新镜像,启动新镜像和原来的对比。
# -p 有端口要放行(主机对docker的端口:容器内tomcat端口)
docker run -it -p 8881:8080 tmocat
docker exec -it id 路径
...更改
docker commit -a="Author" -m="Change Information" id yxt/tomcat:1.2
就得到了自己的镜像
运行自己更改后的容器
docker run -it -p 8080:8080 yxt/tomcat:1.2
五:容器数据卷
- 实现宿主机和容器的数据共享!
- 容器中/宿主机中删改文件,都会同步到另一个上!
(1)直接命令添加
docker run -it -v /宿主机的绝对路径:/容器内目录 镜像名
加权限,read only..
docker run -it -v /宿主机的绝对路径:/容器内目录:ro 镜像名
(2)DockerFile
是镜像模板的描述文件
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,---success1"
CMD /bin/bash
我的理解就是这个和脚本的.sh
文件很像,可以省去在命令行一句一句打了。
上面这段话相当于在命令行中写:
docker run -it -v /host1:/dataVolumeContainer1 -v /host2:/dataVolumeContainer2 centos /bin/bash
通过DockerFile添加镜像
docker build -f dockerfile -t yxt/centos .
此时的新镜像是yxt/centos,如果run
这个镜像,则会自动添加两个数据卷!
(3)数据卷容器
之前数据卷在容器和宿柱机上传输,可以理解为活动硬盘挂载在主机上,那么现在是活动硬盘挂在活动硬盘上再连主机。
docker run -it --name dco3 --volumes-from dc01 yxt/centos
实现互相之间都可以传递
父dc01删除后,子类dc02 / dc03仍保存原来的修改,而且dc02更改仍然可以使得dc03更改。
六:DockerFile解析
(1)过程解析
Docker 执行DockerFile 的流程:
- docker 从基础镜像中运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit 的操作提交一个新的镜像
- docker基于刚刚生成的镜像运行新容器
- 执行dockerfile中的下一条指令直到所有指令执行完成
(2)体系结构(保留字指令)
FROM 基础镜像
MAINTAINER 维护者和邮箱地址
RUN 构建时要运行的命令
EXPOSE 对外的端口
WORKDIR 工作目录位置
ENV 设置环境变量 (MY_PATH/user/mytest)
ADD 文件拷贝至镜像且自动解压缩,识别url
COPY ["need","target"]
VOLUME ["V1","V2"]
CMD + shell / exec (只有最后一个生效)
ENTRYPOINT 命令
ONBUILD 当构建一个DockerFile时运行,父在被继承时触发
魔改生成新镜像举例1:
直接docker pull centos
得到的配置太少(连vim都莫得),这里添加点
from centos
MAINTAINER yxt<3225155810@qq.com>
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $mypath
CMD echo "successful!"
CMD /bin/bash
duild构建新镜像
docker build -f /mydocker/Dockerfile -t mycentos:1.3 .
看更改执行历史(倒过来的)
docker history id
注意:CMD后面的命令会被docker run
后面的参数替换,(没见过例子,以后如果遇到查一下)
补充知识:curl
来看页面信息
curl http://39.98.122.96 # 举个例子
举例2:docker安装MySQL并和外部连接(ok
七:本地镜像发布到阿里云
Step 1:安装Docker环境
Step 2:开通阿里云容器镜像服务
Step 3:代码构建过程
1)在本地新建文件夹,文件夹名为tianchi_submit_demo
2)新建Dockerfile文件
# Base Images
## 从天池基础镜像构建
FROM registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
## 把当前文件夹里的文件构建到镜像的根目录下
ADD . /
## 指定默认工作目录为根目录(需要把run.sh和生成的结果文件都放在该文件夹下,提交后才能运行)
WORKDIR /
## 镜像启动后统一执行 sh run.sh
CMD ["sh", "run.sh"]
3)新建run.sh文件
python sum.py
4)新建sum.py文件
import csv
import json
#第一题
print("Hello world")
#第二题
with open('./tcdata/num_list.csv') as f:
row = csv.reader(f, delimiter=',')
height = []
for r in row:
height.append(int(r[0]))
s = sum(height)
height_down = sorted(height, reverse=True)
# print(height_down)
height_down_10 = []
for i in range(10):
height_down_10.append(height_down[i])
#写入JSON文件
jsondata = json.dumps({'Q1': 'Hello world', 'Q2': s, 'Q3': height_down_10},
sort_keys=True, indent=4, separators=(',', ': '))
fjson = open('result.json', 'w')
fjson.write(jsondata)
fjson.close()
5)添加测试数据 /tcdata/num_list.csv
6)创建镜像
docker build -t registry.cn-beijing.aliyuncs.com/littlefisher79/aliyuntest:1.0 .
7)登陆
docker login --username= registry.cn-beijing.aliyuncs.com
输入的用户名和密码都是阿里云账户的
8)推送镜像
docker push registry.cn-beijing.aliyuncs.com/littlefisher79/aliyuntest:1.0
9)提交镜像
registry.cn-beijing.aliyuncs.com/littlefisher79/aliyuntest:1.0
八:总结
以上就是从Docker的认识,命令,更改,上传的流程。
很多命令我是肯定记不住的,以后过来查就行了。
果然什么东西都是要自己做一遍才能了解,尤其是最后这道阿里云天池的题,很全面的从构建代码,建立镜像,DockerFile的应用到最后的上传镜像综合了一遍,至少让我知道大概的流程是啥了。
吃饭去喽!
哈哈哈 学到了 我也是初学者 大佬这个词可真背不起