记Docker折腾出来的一点心得
前言
很久没有正经写笔记这些东西了,今天终于入了docker的门,就简单写一下
最近一直在写程序,我个人现在入了不少语言的门,所以在写东西的时候,会根据自己的需求选择一下用哪门语言。
一般来说:
- 如果是自己用就写Python,也懒得去拆分各种虚拟环境,反正都是自己用,环境一般不会出啥大问题。
- 如果要分发给别人用,我之前首选Kotlin这门JVM语言,图他完全兼容Java,语法却比Java简单非常多,也完全不用考虑用户的环境问题,一切交给JVM。
- 当然现在我会考虑golang,golang除了全平台兼容,极快的运行速度外,目前感觉最大的好处在于编译快。而且用了一小段时间,最开始觉着略微难用,最近莫名觉得用的舒服爽快(真香)。
但是最近一直在搞Python,尤其是matplotlib作图的东西,然后需要分发给别人用,之前我分发软件都是pyinstaller
,但是感觉不是很舒服,会有各种稀奇古怪的问题。加上后边还有更复杂的需求,于是瞄上了鼎鼎大名的docker。
Docker
Docker类似于虚拟机(虽然它并不是,但是虚拟机更好理解),可以让用户通过配置文件,在虚拟的容器···内部配置各种环境变量,各种软件。然后打包成images发布,其他用户只需要有docker,就可以把这个image pull下来使用期内配置好的软件。
神奇的是docker能够运行各式各样的软件,还基本不拖慢性能。
Docker由镜像(images)、容器(container)和仓库构成。
- 镜像:就是打包好的各种环境,类似于虚拟机中的各种环境,就是一个只读的模板,可以理解为原生的纯净系统。
- 容器:用户运行的各项命令和各项操作,就是在容器中完成的。就可以理解为在镜像这个系统基础上安装添加的各种数据和文件环境。所以容器可以启动、停止、删除等等。
- 仓库:个人用户完成开发,打包了一个镜像,然后需要发布,就可以推送到仓库上,其他人拉一下就可以使用了。
安装
我就不多说了
中文。这个页面介绍的很详细了,基本将官方文档的各方面内容都涵盖了。
-
注意:
- 由于安全性考量,docker必须要用root权限安装。
- 安装后在系统中新建一个docker group。并且将用户添加到该组后,组内成员就能正常使用docker了。
- 而且docker只需要配置一遍,所有组内成员都能使用
# 添加docker用户组
sudo groupadd docker
# 将当前用户添加到docker组,其他用户就替换相应的username
sudo usermod -a -G docker $USER
# 退出重新登陆后,运行以下命令就能查看是否以进入docker组了
id -aGn username
常用
-
更换docker镜像源
默认用的都是美国镜像,说多了都是泪
永久更换镜像可以编辑/etc/docker/daemon.json
,并且填入以下内容# 除了以下的docker中国,还可以选择中科大http://docker.mirrors.ustc.edu.cn/ { "registry-mirrors": ["https://registry.docker-cn.com"] }
-
更换docker储存路径
默认docker的存储路径为
/var/lib/docker
。
系统盘可能会面临空间不够的情况,所以最好还是换一个目录。-
软连接
# stop docker sudo systemctl restart docker # or sudo service docker stop # move docker data to another directory mv /var/lib/docker /root/data/docker ln -s /root/data/docker /var/lib/docker
命令行参数,启动docker时添加
--graph=/var/lib/docker
-
更改配置文件
- Ubuntu:
/etc/default/docker
->OPTIONS=--graph="/root/data/docker" -H fd:// #或者后边这行 DOCKER_OPTS="- /root/data/docker"
- CentOS:
/etc/sysconfig/docker
->OPTIONS=--graph="/root/data/docker" --selinux-enabled -H fd://
- Ubuntu:
-
-
拉取镜像
基本命令形式为
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
以拉取Ubuntu 18.04的镜像为例
docker pull ubuntu:18.04
-
基础运行
# 该命令的最终效果为,进入ubuntu 18.04的bash环境,在它的bash环境内做操作 docker run -it -v /mnt:/mnt --rm ubuntu:18.04 bash
以上参数中:
-
-i
-> 交互式操作 -
-t
-> 终端 -
--rm
-> 容器退出后即清除,节省空间 -
-v
-> 这个参数是一个非常实用的参数,docker毕竟是虚拟机,docker内部天然跟外部环境无法沟通。- 但是用来打包命令行工具,当然需要进行交互。
-
-v
就是将外部的地址,挂载映射到内部地址的参数。 - 比如上方,docker内部的程序,就可以通过同样
/mnt
路径访问外部的数据了
- 随后两个就是启用的镜像名称,和执行的命令
-
-
列出镜像,删除镜像
# 列出镜像 docker image ls # 列出镜像体积 docker system df # 列出无用镜像 docker image ls -f dangling=true # 清除无用镜像 docker image prune
删除镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
-
Dockerfile,快速构建镜像
FROM debian:stretch # 以什么镜像为基础 # 一些在构建镜像时指定的命令,就是基础的bash命令 RUN apt-get update RUN apt-get install -y gcc libc6-dev make wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN mkdir -p /usr/src/redis RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 RUN make -C /usr/src/redis RUN make -C /usr/src/redis install # 另一种形式 RUN buildDeps='gcc libc6-dev make wget' \ && apt-get update \ && apt-get install -y $buildDeps \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && mkdir -p /usr/src/redis \ && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \ && make -C /usr/src/redis \ && make -C /usr/src/redis install \ && rm -rf /var/lib/apt/lists/* \ && rm redis.tar.gz \ && rm -r /usr/src/redis \ && apt-get purge -y --auto-remove $buildDeps # 将外部文件复制到docker内部 COPY ./package.json /app/ # CMD命令则是表明在启动容器时,容器内部需要执行的命令 # 如下则是在启动容器时,运行nginx并且能够守护nginx的运行 # 为何不像平常一样使用service比较有讲究,可以看一下本文最开始参见的部分内容 CMD ["nginx", "-g", "daemon off;"] # endpoint则是将docker容器转化为命令行工具使用 ENTRYPOINT [ "python", "main.py" ]
构建镜像则可以通过
docker build -t nginx:v3 .
实现。 -
镜像导入和导出,较简单,不多说
docker export 7691a814370e > ubuntu.tar cat ubuntu.tar | docker import - test/ubuntu:v1.0 # or docker import http://example.com/exampleimage.tgz example/imagerepo
有疑问加站长微信联系(非本文作者)