centos7安装docker,并使用docker部署django项目

centos7安装docker:
参考:https://www.cnblogs.com/yufeng218/p/8370670.html
uname -r(查看系统版本)
sudo yum update(注意:如果服务器上有运行的服务,不要更新,否则之前的服务可能不能正常运行)
sudo yum remove docker docker-common docker-selinux docker-engine(如果安装过docker,卸载旧版本docker)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2(安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo(设置yum源)
yum list docker-ce --showduplicates | sort -r(可以查看所有仓库中所有docker版本,并选择特定版本安装)
sudo yum install docker-ce(安装docker)
sudo systemctl start docker(启动)
sudo systemctl enable docker(加入开机启动)
docker version(验证安装是否成功(有client和service两部分表示docker安装启动都成功了))

docker部署django应用:
参考:https://www.jb51.net/article/154557.htm
参考:https://www.cnblogs.com/ghylpb/p/12616943.html
参考:https://zhuanlan.zhihu.com/p/331785279
docker pull centos:7.9.2009(下载centos docker镜像)
docker pull mysql:5.7.32(下载mysql docker镜像)
docker images(查看本地已有镜像)
docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32(启动mysql docker容器,宿主机端口3306对应容器端口3306,mysql默认启动端口是3306)
docker run -dit -p 8000:8000 --name centos01 centos:7.9.2009(启动centos docker容器,宿主机端口8000对应容器软口8000)
docker ps(查看正在运行的容器)
ifconfig(查看宿主机ip和dockerip)
yum install net-tools -y(如果ifconfig无法使用,先安装网络工具)
docker inspect mysql01(查看 MySQL容器IP,重点在NetworkSettings中的IPAddress,这个才是该容器的真实IP)
docker inspect centos01(查看 CentOS容器IP,重点在NetworkSettings中的IPAddress,这个才是该容器的真实IP)
docker exec -it mysql01 bash(进入mysql容器,exec命令进入容器再退出后,容器不会停止;attach进入容器再退出后,容器停止)
mysql -u root -p123456(登录数据库)
create database blog01 default charset utf8;(创建数据库)
exit(退出数据库)
exit(退出mysql容器)
docker exec -it centos01 bash(进入centos容器,exec命令进入容器再退出后,容器不会停止;attach进入容器再退出后,容器停止)
yum install vim -y(安装vim工具)
yum install net-tools -y(安装网络工具)
yum install python36 -y(安装python36,安装完之后,使用python3和pip3执行命令)
yum install git -y(安装git工具)
ping www.baidu.com(测试能否访问外网)
ping xxx.xxx.xxx.xxx # 测试是否能访问宿主机
ping xxx.xxx.xxx.xxx # 测试是否能访问MySQL容器
git clone https://xxxxxxxxxx(拉取git项目)
后面就是常规操作(安装依赖,用3306端口配置django项目数据库链接,makemigration,migrate,用8000端口运行django项目,外网访问宿主机ip进行测试)

修改docker mysql运行端口:
参考:https://blog.csdn.net/sswqzx/article/details/87433420
参考:https://ld246.com/article/1575269751601
docker exec -it mysql01 bash(进入mysql容器,exec命令进入容器再退出后,容器不会停止;attach进入容器再退出后,容器停止)
apt-get update(更新软件)
apt-get install vim(安装vim)
apt-get install net-tools(安装网络工具)
vim /etc/mysql/mysql.conf.d/mysqld.cnf(编辑MySQL配置文件)
添加port=3307
保存
netstat -tunlp(查看mysql运行的端口)
service mysql restart(重启mysql服务,自动退出容器)
在宿主机上:
docker ps -a(查看停掉的mysql容器的id,假设是xxxxxxx)
docker start xxxxxxx(启动容器id为xxxxxxx的mysql容器)
netstat -tunlp(查看mysql运行的端口)

docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32(启动容器时报错):
docker: Error response from daemon: Conflict. The container name “/myubuntu” is already in use
参考:https://blog.csdn.net/liuyinfei_java/article/details/88634469
docker rm $(docker ps -a -q) 先删除容器,之后再启动容器(删除容器之后再启动,之前容器中修改的内容就清空了,可以用docker start xxxxx,来启动停止的容器)
docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32(启动mysql docker容器,宿主机端口3306对应容器端口3306,mysql默认启动端口是3306)

导出容器快照镜像,导入容器快照镜像,启动容器快照镜像:
参考:https://www.runoob.com/docker/docker-container-usage.html
docker export 1e560fca3906 > ubuntu.tar(导出容器实例快照到当前目录)
cat ubuntu.tar | docker import - test/centos01:v1(将当前目录下容器实例将快照文件ubuntu.tar导入到镜像 test/ubuntu:v1:)
docker images(查看本地镜像)
docker run -dit -p 5555:5555 --name centos01v1 test/centos01:v1 python app.py(启动容器test/centos01:v1,并运行python app.py命令,如果命令运行失败,容器会自动停止)
docker run -dit -p 5555:5555 --name centos01v1 test/centos01:v1 bash(启动容器test/centos01:v1,并运行bash命令,命令bash运行成功,容器不会自动停止)
docker ps -a (查看所有容器,包括正在运行的和已经停止的)
docker rm xxxxx(删除容器)

运行web应用:
参考:https://www.runoob.com/docker/docker-container-usage.html
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py(-d:让容器在后台运行。-P:将容器内部使用的网络端口随机映射到我们使用的主机上。)
docker ps(查看正在运行的容器)
浏览器访问测试
docker run -d -p 5000:5000 training/webapp python app.py(通过 -p 参数来设置不一样的端口:5000)
docker ps(查看正在运行的容器)
浏览器访问测试

swarm容器集群管理(管理一堆机器,不是一堆docker):
参考:https://www.runoob.com/docker/docker-swarm.html
参考:https://www.cnblogs.com/zhujingzhi/p/9792432.html
docker swarm init(将当前机器设置为manage节点,并初始化)
docker swarm join-token worker(生成以worker身份加入swarm集群指令:docker swarm join --token xxxxxxxx xxx.xxx.xxx.xxx:2377)
在其它想以worker身份加入这个集群的机器上执行docker swarm join --token xxxxxxxx xxx.xxx.xxx.xxx:2377(即可将该机器加入集群管理,需要在该机器上安装docker,并且网络互通)
docker swarm join-token manager(生成以manager身份加入swarm集群指令:docker swarm join --token xxxxxxxx xxx.xxx.xxx.xxx:2377)
在其它想以manager身份加入这个集群的机器上执行docker swarm join --token xxxxxxxx xxx.xxx.xxx.xxx:2377(即可将该机器加入集群管理,需要在该机器上安装docker,并且网络互通)
docker node ls(在manager机器上执行该指令,查看swarm集群中的节点)

dockerswarm与k8s集群管理区别:
参考:https://blog.csdn.net/Delicious_Life/article/details/108562389
K8S和DockerSwarm都是用来解决容器集群化部署相关问题的,他俩有啥区别?
1.K8S可处理的DockerImages在100-1000个。DockerSwarm可处理的DockerImages在10-20个
2.K8S的界面管理工具效果更加直观
3.DockerImages配置比K8S简单

docker配置加速:
参考:https://blog.csdn.net/Bighead_1/article/details/109492538?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-17.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7Edefault-17.no_search_link
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://6d4kf5cu.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

删除镜像:
参考:https://jingyan.baidu.com/article/1612d50011053da20e1eeefc.html
docker rmi xxxxxx(删除镜像)
docker rmi -f xxxxx(强制删除镜像)

容器日志查看
参考:https://www.cnblogs.com/tiger666/articles/10671509.html
docker logs -f 容器id(-f代表持续打印)

报错(SQLite 3.8.3 or later is required (found 3.7.17).)的解决办法:
参考:https://blog.csdn.net/weixin_44110998/article/details/103499213
方法一:给Django降级
pip list(查看django版本)
pip uninstall django(卸载Django)
pip install django==2.1.7(安装低版本,版本号根据自身项目选择合适的)

dockerfile的使用:
参考:https://blog.csdn.net/atlansi/article/details/87892016
参考:https://www.runoob.com/docker/docker-dockerfile.html
参考:https://www.cnblogs.com/tiger666/articles/10671509.html
参考:https://www.cnblogs.com/yfalcon/p/9044183.html
新建docker项目文件夹,比如/var/www/docker_project,并进入该文件夹:
touch Dockerfile(Dockerfile即为自动build python的文件,此文中的核心也是Dockerfile)
touch run.sh(run.sh是用来执行Django的bash脚本)
wget https://media.djangoproject.com/releases/2.1/Django-2.1.7.tar.gz(下载一个django-2.1.7的源码包,放在此目录)
wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo(下载阿里云扩展源epel.repo文件,也放在此目录)
编写Dockerfile文件:

FROM centos
FROM python:3.6.6

ADD CentOS-Base.repo /etc/yum.repos.d
ADD epel.repo /etc/yum.repos.d

RUN pip3 install setuptools
ADD Django-2.1.7.tar.gz /opt/

WORKDIR /opt/
RUN mv Django-2.1.7 django

WORKDIR /opt/django
RUN python3 setup.py install

WORKDIR /opt
RUN django-admin.py startproject qishidj

ADD run.sh /opt/qishidj/run.sh
RUN sed -i "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['\*'\]/g" /opt/qishidj/qishidj/settings.py
WORKDIR /opt/qishidj
RUN chmod 777 run.sh
EXPOSE 8899
CMD ["/bin/sh","run.sh"]

python3 manage.py runserver 0.0.0.0:8000(编写run.sh文件)
docker build -t tiger/django-217 --rm . (解析:-t tiger/django-217,为构建的镜像标记名称,即镜像名为:tiger/django-217;–rm,整个构建过程成功后删除中间环节的容器;.,单独的点,意思为根据当前目录下的Dockerfile文件生成镜像)
docker run -d -p 9090:8899 tiger/django-217(此时后台启动镜像,并把8899端口映射出来)
docker ps (查看启动的容器)
docker exec -it xxxxxx /bin/bash(使用交互模式进入容器)
ps -ef(查看启动的进程)
浏览器访问页面 xxx.xxx.xxx.xxx:9090
docker logs -f container_id(查看容器日志)
docker save -o centos_django217.tar.gz tiger/django-217(导出镜像到当前目录,-o 参数 指定地址和文件名 镜像名)

docker-compose的使用:
参考:https://www.jianshu.com/p/658911a8cff3
参考:https://www.runoob.com/docker/docker-compose.html
compose安装:
sudo curl -L “https://github.com/docker/compose/releases/download/1.24.1/docker-compose- ( u n a m e − s ) − (uname -s)- (unames)(uname -m)” -o /usr/local/bin/docker-compose(下载 Docker Compose 的当前稳定版本二进制包)
sudo chmod +x /usr/local/bin/docker-compose(将可执行权限应用于二进制文件)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose(创建软链)
docker-compose --version(测试是否安装成功)
compose使用:
mkdir composetest
cd composetest
在当前文件夹创建文件app.py,内容如下:

import time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)


@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

创建文件requirements.txt ,内容如下:

flask
redis

创建Dockerfile 文件,内容如下:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

创建创建 docker-compose.yml文件,内容如下:

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

docker-compose up(使用compose构建和启动项目)
docker-compose up -d(使用compose构建和启动项目,后台执行该服务)

猜你喜欢

转载自blog.csdn.net/sinat_26809255/article/details/121701840