背景:从上次和白千大佬聊天得知Docker的重要后,LyuLumos大佬搭建的CUC-OJ也用到了传说中的Docker。为了能听懂他们在说什么...赶紧过来了解下皮毛。
(在爬了,在爬了.jpg)

零:前置知识

  1. Linux命令和背景知识 Linux命令大全
  2. 了解仓库Git等使用(Docker Hub / Github)

一:什么是Docker

docker部署redis实战- 知乎

从图标形象来看

  • 大海(宿主机)
  • 鲸鱼(Docker)
  • 背上的箱子(容器实例)(来自镜像模板)

背景知识补充

  1. docker出现的原因:解决开发和运维工程师(部署)的矛盾,根本原因是环境和配置的改变。
  2. 解决方法:使软件和环境一起安装,将代码,配置,系统数据一起打包给运维。
  3. Docker的理念:“一次封装,次次运行”,解决运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟技术。
  4. Docker 和 VM的不同:

    1. VM模拟出完整的系统,硬件也模拟了(慢,占内存..)
    2. Docker只模拟新需要的库资源和设置(轻量级)

二:Docker 安装

镜像 / 容器 / 仓库(存放镜像) Docker Hub

安装文档地址

#举例:CentOS 6.8
yum install -y epel-release
yum install -y docker-io
service docker start

加速:阿里云 / 网易云

永远的HelloWorld

image-20210105091433455

三: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

就得到了自己的镜像

image-20210105123556814

运行自己更改后的容器

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 .

image-20210105140105426

此时的新镜像是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

image-20210105172959407

八:总结

以上就是从Docker的认识,命令,更改,上传的流程。

很多命令我是肯定记不住的,以后过来查就行了。

果然什么东西都是要自己做一遍才能了解,尤其是最后这道阿里云天池的题,很全面的从构建代码,建立镜像,DockerFile的应用到最后的上传镜像综合了一遍,至少让我知道大概的流程是啥了。

吃饭去喽!

Last modification:January 5th, 2021 at 05:53 pm
请赏我杯奶茶,让我快乐长肉