安装配置
配置阿里云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的源码包是我从网上找的

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_linux


dockerfile的语法

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_02

# 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

这个镜像启动会闪退,

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_03


原因是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 目录下

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_nginx_04


所以这块要改成目前所在路径,那么我们是改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 pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_05


docker exec -it myblog /bin/bash 进入终端

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_06


修改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行

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_nginx_07


手动执行run.sh可以看到

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_k8s_08


建表

python manage.py makemigrations

python3 manage.py migrate创建用户名密码:

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_09


我们访问机器ip的8002端口,可以看到一下页面

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_10

使用刚才设置的用户名密码登录

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_nginx_11


docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_12


docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_linux_13


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 pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_14


批量删除所有容器,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

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_15


进入其中一个的终端命令行 查看网络是否连通

curl 172.17.0.3

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_16


可以看到正常通讯

那端口映射是怎么回事呢

重新启动一个容器映射到8087端口

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_17


可以看到是可以访问的

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_k8s_18


端口映射如何实现

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_docker_19


Host模式

容器内部不会创建网络空间,共享宿主机的网络空间

docker run --net host -d --name mysql mysql:5.7

docker pull v1.22 本地升级k8s集群v1.23 docker k8s devops_centos_20


可以看到直接占用了宿主机的3306端口

未完待续,如有不懂或者不详细,可评论,看到即完善,感谢阅读!