DOCKER 灵活部署我的编译环境
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
事实上,docker并没有那么神秘,他的效果就和虚拟机一样,只是消耗更少的系统资源,更快的运行速度。
安装docker
由于GFW的存在,我们直接按照docker官网的操作,基本不是很慢就是根本下不了:fire:(生气)。
所以我们要用国内的镜像,我选了清华开源镜像库的,文件新而且快。
跟着链接中的安装提示做就好了,代码就不贴了。
配置一个docker加速器
同样因为GFW的存在,docker pull 命令会很慢,我们可以前往Docker加速器.
如果你没有daocloud的账号,你需要注册一个,因为你会需要加速器的
了解docker的基础命令
- 我常用的一些命令
# 本机环境 pop-os 18.04 基于Ubuntu 18.04
docker login 登陆你的docker hub账户
docker pull 默认先从本地拉取镜像,如果没有同名镜像,前往docker hub拉取
docker push 提交你的镜像,需要先使用docker login。提交后,即使本地没了仍可以直接从账户中拉取到。
docker images 查看你本地的镜像
docker ps 查看你现在运行的容器,使用-a 可以查看所有存在的container
docker start 启动一个未启动的容器
docker attach 进入一个启动的容器
docker kill 结束一个启动的容器
docker rmi 删除一个存在的镜像
docker rm 删除一个存在的容器
了解这些命令基本就可以利用docker来配置每个项目独特的运行环境了。
如果需要查看更多命令,可以在命令行中输入docker查看或使用搜索。:P
使用镜像
- 我这里使用alpine来举例子,配置一个django project
docker pull alpine
# 等待下载完成,alpine非常小,大概就4MB多.基本一个ubuntu的image要120MB
docker images
- 你可以看到打印出的images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest 11cd0b38bc3c 2 weeks ago 4.41MB
- 接着你可以使用这个image,搭建你的项目运行环境
docker run -ti --rm -p 5000:5000 -v ~/Stephen-Ling/演示/:/srv/演示/ --name test alpine
-t tty
-i 交互界面,提供命令行使用
-p 映射端口 本机端口:容器的端口
-v 映射目录 本机目录:容器内目录,确保本地目录存在,否则无效果
--rm 容器停止后自动删除,因为演示用,不用保存
--name 容器命名方便在列表里找到
- 进入容器后,先安装nano,python3,python3-pip.这里应该要更换源,否则基本安装不上了。不得不说GFW 666 :P
apk add nano python3
- 使用pip安装django
pip3 install django
- 使用django创建一个project
cd /演示目录
python3 -m django startproject test
- 得到你的django project 目录
/演示目录/test # ls
manage.py test
DockerFile
我们一般配置的环境都希望可以重复使用,而不应该为换电脑等等事情丢失配置。装电脑超级麻烦:cry:
所以我们使用docker commit 命令可以将你的容器保存成镜像。
docker commit 将一个容器保存成镜像
但是我们的镜像并不能直接修改。如果你要修改,恭喜你。你先需要运行,在里面安装,经过一系列操作,再次commit。
为了避免这个麻烦,所以我们需要dockerfile来配置环境:
1. 直观
2. 随时可以修改配置
3. 更加利于保存,直接github一下你的dockerfile
4. 方便与别人分享
为了加深理解,我用dockerfile配置一个postgres数据库举个例子。
# 整个配置dockerfile的目录结构
├── Dockerfile #dockerfile文件
├── entrypoint_postgres.sh #要在进入容器时执行的shell脚本
├── postgres_configure #postgresql数据库配置
│ ├── pg_hba.conf #类似防火墙配置,拒绝配置以外ip请求访问
│ ├── postgresql.conf #主设置
│ ├── root.key #用于ssl远程登陆的
│ ├── server.crt #同上
│ └── server.key #同上
└── settings.sh
1 directory, 8 files
- apk镜像地址配置,apk是alpine的包管理
# 清华开源镜像
https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.8/main/
https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.8/community/
- DOCKERFILE
FROM ALPINE:V3.8 #拉取这个镜像(默认先拉取本地)
MAINTAINER Stephen Ling "lingfromsh@163.com" #维护人员信息/作者信息(非必要)
EXPOSE 5432 #开放5432端口
COPY ./apk/repositories /etc/apk/repositories #添加国内镜像地址 复制粘贴 本地位置:容器内位置
RUN apk add postgresql
ADD ./entrypoint_postgres.sh /root/entrypoint_postgres.sh
ADD ./settings.sh /root/settings.sh
ADD ./postgres_configure/postgresql.conf /root/postgresql.conf
ADD ./postgres_configure/pg_hba.conf /root/pg_hba.conf
CMD ["/bin/bash", "/root/entrypoint_postgres.sh" ] #要在进入容器时可以输入这个命令 /bin/bash /root/entrypoint_postgres.sh 则进入时直接执行这个shell脚本了。
- postgresql.conf
# 配置文件内容很多,展示一些必要操作。
listen_addresses = '*' # 表示监听所有地址的请求,否则只能本地了。
port = 5432 # 端口号
- pg_hba.conf
# host 表示 一个空白的或者ssl tcp/ip socket
# all 表示 操作的数据库
# all 表示 访问数据库的用户
# 127.0.0.1/32 表示 本机
# trust 表示 使用密码登陆不用加密
# IPv4 local connections:
host all all 127.0.0.1/32 trust
- entrypoint_postgres.sh
#!/bin/bash
mkdir /usr/local/pgsql/
mkdir /usr/local/pgsql/data
mkdir /usr/local/pgsql/log
touch /usr/local/pgsql/log/logfile.log
chown -R postgres:postgres /usr/local/pgsql/data
chown -R postgres:postgres /usr/local/pgsql/log
chown -R postgres:postgres /root/settings.sh
chown -R postgres:postgres /root/
chmod 777 /root/settings.sh
su - postgres -c "/usr/pgsql-10/bin/initdb -D /usr/local/pgsql/data" # 使用postgres身份登陆 初始化postgres数据库,并设置数据存放位置
su - postgres -c "/usr/pgsql-10/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/logfile.log start" # 使用postgres身份登陆 启动postgres数据库,并设置数据存放位置和日志目录
su - postgres -s /root/settings.sh # 为数据库用户改密码,至于调用另一个shell脚本,纯粹是为了方便之后修改维护用。
su - postgres -c "/usr/pgsql-10/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/logfile.log stop"
cp /root/postgresql.conf /usr/local/pgsql/data/postgresql.conf
cp /root/pg_hba.conf /usr/local/pgsql/data/pg_hba.conf
su - postgres -c "/usr/pgsql-10/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/log/logfile.log start"
tail -f /usr/local/pgsql/log/logfile.log #持续输出日志文件。
- settings . sh
#!/bin/bash
psql -c "alter role postgres with password '123456aa';" # 因为默认的postgres用户就是postgres,直接进入改个密码就好了。