安装配置
配置阿里云yum源:wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i ‘s/$releasever/7/g’ /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum list
配置docker镜像源:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum安装docker最新版本:yum install docker-ce
使用
docker系统信息:docker system info (docker info)
docker主要组件:镜像,容器,仓库,网络,存储
docker run -d -p 80:80 nginx
-d 放在后台
-p 端口映射
docker镜像导出:docker image save -o /jettodevops/docker_nginx.tar.gz nginx
进入到镜像终端:docker exec -it id /bin/bash
批量删除容器:docker rm `docker ps -a -q`
指定挂载目录:docker run -d -p 81:80 -v /test:/usr/share/nginx/html nginx:latest
python项目在docker上的部署
源码路径:https://gitee.com/agagin/python-demo.git
dockerfile路径:https://gitee.com/agagin/demo-resources.git
一个B站上的项目,只用于学习,侵删
准备工作先拉取代码代码,以及代码库里的三个dockerfile这个nginx的源码包是我从网上找的
dockerfile的语法
# This my first django Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos:centos7.5.1804
#ENV 设置环境变量
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#RUN 执行以下命令
RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y python36 python3-devel gcc pcre-devel zlib-devel make net-tools
#工作目录
WORKDIR /opt/myblog
#拷贝文件至工作目录
COPY . .
#安装nginx
RUN tar -zxf nginx-1.13.7.tar.gz -C /opt && cd /opt/nginx-1.13.7 && ./configure --prefix=/usr/local/nginx \
&& make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
RUN cp myblog.conf /usr/local/nginx/conf/myblog.conf
#安装依赖的插件
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
RUN chmod +x run.sh && rm -rf ~/.cache/pip
#EXPOSE 映射端口
EXPOSE 8002
#容器启动时执行命令
CMD ["./run.sh"]
为了提高可复用性和效率,可以将此dockerfile拆成两个,一个包含nginx和python3,一个包含项目的源码
于是就有了下面两个dockerfile
Dockerfile-base
# Base images 基础镜像
FROM centos:centos7.5.1804
#ENV 设置环境变量
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8
#RUN 执行以下命令
RUN curl -so /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum install -y python36 python3-devel gcc pcre-devel zlib-devel make net-tools
COPY nginx-1.13.7.tar.gz /opt
#安装nginx
RUN tar -zxf /opt/nginx-1.13.7.tar.gz -C /opt && cd /opt/nginx-1.13.7 && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
Dockerfile-optimized
# This my first django Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos-python3-nginx:v1
#工作目录
WORKDIR /opt/myblog
#拷贝文件至工作目录
COPY . .
RUN cp myblog.conf /usr/local/nginx/conf/myblog.conf
#安装依赖的插件
RUN pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt
RUN chmod +x run.sh && rm -rf ~/.cache/pip
#EXPOSE 映射端口
EXPOSE 8002
#容器启动时执行命令
CMD ["./run.sh"]
执行docker构建
docker build . -t centos-python3-nginx:v1 -f Dockerfile-base
docker build . -t myblog -f Dockerfile-optimized
下一步部署mysql,启动mysql镜像(直接从docker hub 拉取)
docker run -d -p 3306:3306 --name mysql -v /opt/mysql/mysql-data/:/var/lib/mysql -e MYSQL_DATABASE=myblog -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
启动刚制作的镜像,注意,要换成自己的IP
docker run -d -p 8002:8002 --name myblog -e MYSQL_HOST=172.16.10.185 -e MYSQL_USER=root -e MYSQL_PASSWORD=123456 myblog
这个镜像启动会闪退,
原因是dockerfile最后执行了一个run.sh脚本,而这个run.sh脚本报错退出了,所以镜像闪退,所以要修改run.sh脚本
先看这个脚本
#!/bin/bash
uwsgi --ini ./uwsgi.ini
nginx -c /etc/nginx/myblog.conf -g 'daemon off;'
myblog.conf不在/etc/nginx/下,我们已经在dockerfile里将他复制到了/usr/local/nginx/conf 目录下
所以这块要改成目前所在路径,那么我们是改dockerfile重新构建镜像,还是进入到myblog镜像命令行手动修改并执行run.sh,毫无疑问后者简单很多,那么我们首先要让myblog启动起来,
用一下命令让他阻塞
docker run -d -p 8002:8002 --name myblog -e MYSQL_HOST=172.16.10.185 -e MYSQL_USER=root -e MYSQL_PASSWORD=123456 myblog ping 8.8.8.8
docker exec -it myblog /bin/bash 进入终端
修改run.sh
#!/bin/bash
uwsgi --ini ./uwsgi.ini
nginx -c /usr/local/nginx/conf/myblog.conf -g 'daemon off;' #去掉-g是不让终端阻塞
还需要修改 /usr/local/nginx/conf/myblog.conf 第53行
手动执行run.sh可以看到
建表
python manage.py makemigrations
python3 manage.py migrate创建用户名密码:
我们访问机器ip的8002端口,可以看到一下页面
使用刚才设置的用户名密码登录
docker网络
四种网络模式:
- bridge模式,使用–net=bridge指定,默认设置
- host模式,使用–net=host指定,容器内部网络空间共享宿主机的空间,效果类似直接在宿主机上启动一个进程
- container模式,使用–net=container:NAME_or_ID指定容器与特定容器共享网络命名空间
- none模式,使用–net=none指定网络模式为空,即仅保留网络命名空间,但是不做任何网络相关的配置(网卡,IP,路由等)
bridge模式(默认)
安装网桥工具,查看网桥:
yum install -y bridge-utils
brctl show
批量删除所有容器,docker rm -f `docker ps -a -q`
启动两个测试容器
docker run -d --name test1 nginx:latest
docker run -d --name test2 nginx:latest
查看两个容器IP
docker inspect test1
docker inspect test2
进入其中一个的终端命令行 查看网络是否连通
curl 172.17.0.3
可以看到正常通讯
那端口映射是怎么回事呢
重新启动一个容器映射到8087端口
可以看到是可以访问的
端口映射如何实现
Host模式
容器内部不会创建网络空间,共享宿主机的网络空间
docker run --net host -d --name mysql mysql:5.7
可以看到直接占用了宿主机的3306端口
未完待续,如有不懂或者不详细,可评论,看到即完善,感谢阅读!