Docker进阶
1、应用部署
# 在容器内部署mysql # -e表示环境变量 docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 # 官方提供的 docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag # 在容器内部署redis docker run -di -p 6377:6379 redis:latest # 在容器内部署nginx docker run -di --name=mynginx -p 8080:80 nginx
2、部署应用映射外部目录
# 部署redis,把配置文件和数据目录映射出来 # 操作步骤 -1 mkdir /reids /redis/conf /redis/data -2 vim /redis/conf/redis.conf # 配置文件 bind 0.0.0.0 daemonize NO protected-mode no requirepass 123456 -3 创建并运行容器 docker run -p 6378:6379 --name redis_6379 -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data -di redis redis-server /etc/redis/redis.conf -4 本地window机器上远程连接到了docker里的redis -5 cmd窗口下 redis-cli -h 101.133.225.166 -p 6378 -6 认证 auth 123456 -7 写入数据 set name lqz -8 保存数据 save或者是bgsave -9 在宿主机的/redis/data路径下就能看到一个文件 -10 不管多少次重启redis容器,数据都还在 -11 原来的redis容器没了,按照第三步再启动一遍,数据都还在
3、迁移与备份
3.0 其他操作
# 删除所有容器() docker rm `docker ps -a -q` # 删除所有镜像 docker rmi `docker images -q` # 通过自己构建的image启动容器 docker run -id --name=mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088 # 查看容器运行日志 docker logs 容器id # 操作步骤 1 启动一个python容器 docker run -di --name=lqz python:3.6 2 进入装软件 docker exec -it lqz /bin/bash mkdir /project pip install django==1.11.1 退出 3 把项目拷贝到容器内部 docker cp /opt/lqz/django_test lqz:/project 4 把容器做成镜像 docker commit lqz mydjango 5 基于自己做的镜像运行容器 docker run -id --name=mydjango -p 8088:8088 mydjango python /project/django_test/manage.py runserver 0.0.0.0:8088
3.1 容器保存为镜像
docker commit 容器名字 镜像名字
docker commit 19b mydjango
pip install django==1.11.11 -i https://pypi.douban.com/simple/
3.2 把镜像打包成压缩包
docker save -o mydjango.tar mydjango
3.3 把压缩包恢复为镜像
docker load -i mydjango.tar
4、dockerfile
1 dockerfile是什么 一个文件,里面一堆指令,通过这个文件可以生成镜像 2 dockerfile指令 命令 作用 FROM image_name:tag 定义了使用哪个基础镜像启动构建流程 MAINTAINER user_name 声明镜像的创建者 ENV key value 设置环境变量 (可以写多条) RUN command 是Dockerfile的核心部分(可以写多条) ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压 WORKDIR path_dir 设置工作目录 3 写一个dockerfile(文件名字必须交dockerfile) vim dockerfile FROM python:3.6 MAINTAINER lqz EXPOSE 8080 ADD ./requirement.txt /home/ RUN pip install -r /home/requirement.txt -i https://pypi.douban.com/simple/ RUN pip install uwsgi -i https://pypi.douban.com/simple/ VOLUME ["/home"] WORKDIR /home/django_test # CMD ["uwsgi", "--ini", "/home/django_test/uwsgi.ini"] CMD ["python","home/django_test/manage.py","runserver","0.0.0.0:8080"] 4 通过dockerfile构建出镜像 docker build -t='django_1.11.11' . 5 查看镜像 docker images 6 启动容器 docker run -di --name=mydjango2 -v /opt/lqz/:/home -p 8080:8080 django_1.11.11 7 在外部访问即可 8 配置nginx转发 # 创建文件件 mkdir -p /opt/nginx/conf /opt/nginx/html /opt/nginx/logs # 新建配置文件 vim nginx/conf/nginx.conf # 写入 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream node { server 101.133.225.166:8080; server 101.133.225.166:8081; server 101.133.225.166:8082; } server { listen 80; server_name localhost; location / { #proxy_pass http://101.133.225.166:8080; #负载均衡配置 proxy_pass http://node; } } } # docker 中运行nginx docker run --name nginx -id -p 8888:80 -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/html:/etc/nginx/html -v /opt/nginx/logs:/var/log/nginx nginx 9 配置负载均衡 # 修改nginx配置文件 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream node { server 101.133.225.166:8080; server 101.133.225.166:8081; server 101.133.225.166:8082; } server { listen 80; server_name localhost; location / { #proxy_pass http://101.133.225.166:8080; #负载均衡配置 proxy_pass http://node; } } } # 多启动几个docker容器 docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8081:8080 django_1.11.11 docker run -di --name=mydjango3 -v /opt/lqz/django_test2/:/home/django_test/ -p 8082:8080 django_1.11.11 # 重启nginx # 假设8081的容器挂了,8080的容器挂了,正常提供服务, # 再把docker容器启动起来即可
5、私有仓库
1 把自己的镜像传到docker hub上 -docker login 输入用户名密码 镜像ID 用户名 镜像name 版本 -给你要上传的image打个标签docker tag 5452fa6715c0 liuqingzheng/django1.11.9:v1 -docker images -docker push liuqingzheng/django1.11.9:v1
步骤
1 拉取私有仓库镜像 docker pull registry 2 启动容器 docker run -di --name=registry -p 5000:5000 registry 3 打开浏览器 输入地址http://101.133.225.166:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空 4 配置 修改daemon.json vi /etc/docker/daemon.json 添加以下内容,保存退出。 {"insecure-registries":["101.133.225.166:5000"]} 此步用于让 docker信任私有仓库地址 5 重启docker 服务 systemctl restart docker 6 重启容器 docker start registry 7 打标签 docker tag 5452fa6715c0 101.133.225.166:5000/django1.11.11 8 上传到私有仓库 docker push 101.133.225.166:5000/django1.11.11 9 从私有仓库拉取镜像 docker pull 101.133.225.166:5000/django1.11.11
6、docker-compose
1 docker-compose是一个单机情况下容器编排的工具 2 通过yml文件定义多个容器 3 默认名字docker-compose.yml 4 三个概念,Service Networks ,Volumes 一个service代表一个container,这个container可以从docker hub的image来创建,或者从本地dockerfile build的image来创建 5 version:有1,2,3版本,目前都用"3" 6 安装 curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose 7 验证安装成功 docker-compose -v
6.1部署多应用
# 部署flask redis 1 创建Dockerfile vim Dockerfile FROM python:3.6 COPY . /app WORKDIR /app RUN pip install flask redis EXPOSE 5000 CMD [ "python", "app.py" ] 2 创建docker-compose文件 vim docker-compose.yml version: "3" services: redis: image: redis web: build: context: . dockerfile: Dockerfile ports: - 8080:5000 environment: REDIS_HOST: redis 3 创建app.py vim app.py from flask import Flask from redis import Redis import os import socket app = Flask(__name__) redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379) @app.route('/') def hello(): redis.incr('hits') return '你好! 查看 %s 次, hostname 是 %s.\n' % (redis.get('hits'),socket.gethostname()) if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True) 4 启动--运行 docker-compose up
docker-compose.yml 如何写 version: '3' services: wordpress: image: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_PASSWORD: root volumes: - mysql-data:/var/lib/mysql
7、多个容器直接通信方式
1 端口映射到宿主机,直接访问宿主机 2 通过ip地址访问 3 run的时候指定 --link 容器 docker run -di --name=centos1 centos:centos7 docker run -di --name=centos2 --link centos1 centos:centos7 进入到centos2中 ping centos1 可以ping同 # 跨主机的容器通信 -端口映射
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步