0 导语
在说Docker之前,还是得聊聊政治。
唯物史观认为历史是人民群众创造的。
尽管历史人物对历史的情节有一定影响,
但是究其根本,
英雄只能顺应历史潮流涌现,
也就是说是时势造就了英雄,而不是英雄造时势。
打个比方说,
假如朱元璋生活在一个衣食无忧的现在,
他还能去造反当皇帝么?
也许跟你我一样,
吃饱了混混论坛,刷刷抖音……
他没有动力去造反,
更没有机会当皇帝。
所以说:
要有时势,然后才会出英雄。
对于我们搞生物的,
理解起来也很简单,
有了培养基,菌就很容易长起来。
对于我们搞数据分析的人来说,
要创造一个环境,软件才能有用武之地。
1 Docker简介
要想创建这么一个环境,很多时候就要用到Docker。
Docker的官方LOGO对docker的功能描述的很形象(图1),
一条船驮着一堆集装箱在海上航行。
这条大船就相当于我们的服务器,
这是一个大环境,
里面包括很多东西,
比如操作系统,存储空间,以及各种软件工具等等。
这些集装箱我们可以称之为一个个小环境,
每个小环境之间是彼此独立,
而小环境与大环境之间也是彼此独立的。
这种结构好处多多。
应用场景1:环境切换。
我打算在Linux服务器上装一个软件X,
但是软件X依赖的其他库和软件包非常多,
需要全部安装,
我不想在服务器的系统上装太多工具,这时候你就可以建立一个基于虚拟镜像系统的Docker来安装软件X。
应用场景2:系统切换。
当我想在装有Linux系统的服务器上运行Windows系统的软件X的时候,
我可以先获取一个Windows系统镜像,
然后基于此镜像创建一个Docker容器并挂载到真实目录地址,
在Docker的Windows环境下安装软件X,
这样就可以在Linux服务器中通过与Docker的Windows环境来运行软件X。
应用场景3:移植。
比如说我在Docker环境中写好并测试成功了一套数据分析流程。
我想把这套流程安装在另一台服务器上,
如果直接安装的话,需要安装很多依赖的库和软件包。
如果用Docker,则只需要将这个镜像移植到另外一台服务器上,
基于该镜像创建一个容器,将流程拷贝过去即可,注意目录结构一定要一致。
这与现实中的集装箱很像,
A集装箱里面装满了牛奶产品,
B集装箱里面可以装满三聚氰胺,
A和B可以在同一条船上运输而不会导致牛奶里面混入三聚氰胺,
除非必要,
一般也不会导致三聚氰胺或者牛奶流窜到船上其他地方,比如船员的卧室里,当然船员个人行为偷吃三聚氰胺的情况除外。
这里面涉及三个概念:镜像(image)、容器(container)和仓库(repository)。
这几个概念可以这么理解。
Docker即刀壳,不过注意刀壳并不是偏正短语,而是并列短语,意为刀和壳。
镜像为刀,容器为壳(图2)。
刀是用来做事的,切豆腐,杀猪,都行;
容器是用来装刀的,实际上这么比方也有点小瑕疵,在实际应用中容器不仅包括刀壳还包括使用刀的场景。
另外还有个重要概念——仓库,主要用来保存镜像,其实就是放刀的仓库[1]。
2 Docker安装和配置
2.1 安装
我是用的是官方安装脚本进行自动安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun #大约需要5-10分钟,视网络情况而定
sudo systemctl start docker #安装完别忘了启动
sudo systemctl enable docker #设置开机自启动
2.2 配置
2.2.1 docker配置镜像仓库
由于Great Wall的存在,导致国内一些著名的网站如Google、Youtube、P站等网站无法连接,而诸如github、docker等网站也是时好时坏,故而docker的镜像仓库需要针对国内的情况进行个性化配置,以我们能够更加丝滑顺畅地使用docker镜像仓库,具体配置方法如下:
sudo vi /etc/docker/daemon.json #如果文件不存在,可以直接创建它
#填充以下内容,填充完之后注意删除#后的注释内容再保存[4]。
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn/",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
], #个人阿里云进行加速地址
"insecure-registries": [
"10.0.0.12:5000"
],
"data-root": "/data/docker" #镜像存放地址,如果镜像较多,则强烈建议设置此目录到较大存储空间
}
sudo systemctl daemon-reload #守护进程重启
sudo systemctl restart docker #重启docker服务
sudo systemctl status docker #确认docker服务正常运行
docker info #查看Registry Mirrors中是否有已经配置好的镜像仓库地址
2.2.2 非root使用docker的配置 [2]
sudo groupadd docker #添加 docker group
sudo usermod -aG docker <user> #将用户加入该 group内,或使用命令:sudo gpasswd -a ${USER} docker
sudo service docker restart #重启服务,或使用命令:sudo /etc/init.d/docker restart
newgrp - docker #切换当前会话到新 group 或者重启 X 会话
2.2.3 Docker修改默认存储路径
sudo mkdir -p /home/share/docker/ #创建要转移的目录
sudo systemctl stop docker.service #关闭docker服务
sudo systemctl stop docker.socket #关闭dockersocket服务
sudo rsync -avz /var/lib/docker/ /home/share/docker/#备份数据到新目录
修改配置文件。
sudo vi /usr/lib/systemd/system/docker.service
如下所示,注释掉ExecStart所在行,修改为新行添加“-g /home/share/docker”参数。
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -g /home/share/docker -H fd:// --containerd=/run/containerd/containerd.sock
重启Docker。
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo dokcer info #查看Docker Root Dir
(45条消息) 修改docker默认存储路径_lucas-nlp的博客-CSDN博客_修改docker默认存储位置
(45条消息) Docker修改容器默认存储路径_早退的程序员的博客-CSDN博客_docker修改存储目录
3 Docker的基本操作
把大象放冰箱里需要怎么操作?
首先打开冰箱门,然后把大象放进去,最后关上冰箱门。
说到Docker的用法,其实也就像把大象放冰箱里这么简单。
分以下几个步骤:
1)创建Docker,其实创建的是镜像和容器;
2)进入Docker,即进入容器;
3)玩Docker,其实玩的是Docker环境;
4)退出Docker,退出容器。
3.1 镜像和容器的基本操作
本部分介绍了Docker的基本操作,即如何获取镜像,运行容器,进入容器,退出容器等等,真正掌握这些技能,体会设计者的思维方式,还是得需要大量操作,多多入坑,才能成为高手。举例来说,我现在还没成为高手的原因,其实就是坑入的还不够多,目前我总结了一些Docker的基本操作方法,希望能对诸位大哥的学习有帮助。
docker search httpd #查找镜像(https://hub.docker.com/)
docker pull httpd #获取镜像
docker images #列出镜像
docker run -it -v <real_path>:<virtual_path> centos #基于CentOS创建容器并挂载到真实目录地址<real_path>以及其所映射到容器中的虚拟地址<virtual_path>
docker run -it -d -p 80:80 --name datahttpd -v /media/sf_D_DRIVE/apache:/usr/local/apache2/htdocs/ httpd
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py #可以指定IP[1]
docker ps -a #查看所有容器
docker exec -it <container_id> bash #进入容器
docker build -f Dockerfile . #Dockerfile的使用方法
docker commit <container_id> <repository/image> #从容器中创建镜像
docker rm -f <container_id> #删除容器,“-f” 带有强制意味
docker rmi <image_id> #删除镜像,也可以用“-f”去强制
docker port <container_id> #查看容器端口映射情况
3.2 换个环境运行软件
倘若我不想进入Docker,而又想玩Docker,怎么办?
这时候我们只需要用到改变一下docker的参数就好了。
docker run --rm -v <real_path>:<virtual_path> -w <virtual_path> <image_name>:<image_version> <command>
#上面这条命令的大概意思就是创建个容器,进入容器执行命令,执行完毕,退出容器,同时删除容器。
#举例:
docker run --rm -v `pwd`:/data -w /data nimlang/nim:alpine ls
docker run --rm -v `pwd`:/sdbb/pub/yangming/project/test/20210820 -w /sdbb/pub/yangming/project/test/20210820 idseqc mNGSQC.py
#在当前目录下以镜像nimlang/nim:alpine为环境运行ls命令,其实就是ls一下,哈哈!
4 Dockerfile
Dockerfile用于一键式制备Docker镜像,即应用Dockerfile命令编辑Dockerfile文件,使之成为一套能够被docker build命令解析的程序[3],因此我们可以把Dockerfile看成是一门编程语言。
4.1 Dockerfile的编写
最近张三用python写了个程序叫alphago,打算为python程序alphago创建一个Docker环境。于是编写了一个Dockerfile,内容如下。
# This dockerfile uses the centos image
# VERSION 1 - EDITION 1
# Author: zhang3
# Command format: Instruction [arguments / command] ..
FROM centos
MAINTAINER zhang3 zhang3@qq.com
RUN yum install -y wget
RUN cd /opt; \
wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh; \
sh Miniconda3-latest-Linux-x86_64.sh -p /opt/miniconda3 -b
RUN /opt/miniconda3/bin/conda init
RUN source /root/.bashrc
RUN mkdir /opt/alphago/
COPY ./ /opt/alphago/
RUN cd /opt/alphago/; sh compile.sh
RUN rm -f /opt/*.bz2
RUN /opt/miniconda3/bin/pip install -r /opt/idseqc/requirements.txt
EXPOSE 518
EXPOSE 910
CMD ['/opt/miniconda3/bin/python','--help']
```
上面这个Dockerfile主要用了几个简单的命令,相信编程经验丰富的诸位大哥们不用看说明文档差不多也能看明白。
比如,FROM centos 就是指要创建的镜像来自于centos镜像;
再比如,MAINTAINER zhang3 zhang3@qq.com #记录镜像维护者的信息;
再再比如,RUN <bash command> #RUN后面加bash命令, 熟悉linux的大哥们都懂的;
再再再比如,COPY?字面意思啊!!!
……
后面不再赘述了,想了解Dockerfile这门编程语言的大哥可自行参阅相关资料,比如Docker Dockerfile | 菜鸟教程 (runoob.com)。
4.2 用Dockerfile创建镜像
编辑好Dockerfile后将其保存于alphago软件的主目录下,
然后运行以下命令构建Docker镜像。
docker build -t alphago:v20210929 . #创建镜像,别忘了后面有个点点
docker images #查看镜像你就会看到你刚刚创建的镜像
5 镜像的移植
5.1 镜像的导出
save命令可实现从本地已有的镜像中导出tar文件。
docker save > idseqc_test.tar idseqc_test:v20211014 #导出镜像
gzip idseqc_test.tar.gz #压缩镜像
5.2 镜像的导入
load命令可实现从tar文件导入本地镜像。
gunzip idseqc_test.tar.gz
docker load < idseqc_test.tar
除此之外,还有export命令和import命令可以进行移植操作,只不过这两个命令针对的是容器,即通过容器导出导入镜像文件[5]。
5 相关问题
机器重启之后,执行docker命令往往会报如下错误:
$sudo docker ps -a
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running
此时需要启动docker
$sudo systemctl start docker
启动完成,即可恢复正常。
docker 不能删除容器怎么办-Docker-PHP中文网
参考文献
[1] Docker 容器使用 | 菜鸟教程 (runoob.com)
[2] (14条消息) Ubuntu下docker使用非root权限运行docker_lynnyq-CSDN博客_docker只能root权限吗
[3] https://docs.docker.com/develop/develop-images/dockerfile_best-practices
[4] Docker中 /var/lib/docker/overlay2/磁盘爆满,如何解决? - 西瓜君~ - 博客园 (cnblogs.com)
[5] https://blog.csdn.net/ncdx111/article/details/79878098
布莱特杨
2020.6.24