docker使用

1.docker介绍

一个软件,支持在win\linux\mac上安装。

作用:在一台电脑上根据模板创建出多个隔离的环境,相比其他方式节省资源。

1.1 隔离环境作用

在这里插入图片描述
在这里插入图片描述

1.2 名词解释

  • DockerHub:远程镜像仓库。仓库中有官方的一些镜像文件,也有开发者自定义的镜像文件。https://hub.docker.com/

  • Images:本地镜像仓库。镜像就是模板,内部包含打包好了运行所需依赖 + 业务代码,后期基于镜像一键创建出的容器也就会自动包含依赖和业务代码,直接就可以运行了,不需要再安装+拷贝代码了。

  • Container:容器,根据镜像创建的隔离环境。
    在这里插入图片描述

2.环境搭建

2.1 window环境

需要下载虚拟机和centos

虚拟机下载地址:https://www.vmware.com/sg/products/workstation-pro/workstation-pro-evaluation.html

centos下载地址:https://developer.aliyun.com/mirror/?lang=zh-CN

下载的VMware-workstation-full-17.0.0-20800274和centos-7-x86-Minimal-2009.ios

虚拟机激活码:MC60H-DWHD5-H80U9-6V85M-8280D

在这里插入图片描述

2.1.1 安装docker社区版

  • 配置repo源

    curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    yum clean all && yum makecache
    
  • 查看可下载版本

    yum list docker-ce --showduplicates | sort -r
    
  • 安装

    # 最新版
    yum install -y docker-ce
    
    # 指定版本
    yum install -y docker-ce-23.0.6
    

2.1.2 启动docker-ce社区版

  • 设置开机启动

    systemctl enable docker 
    
  • 启动docker

    systemctl start docker  
    
    systemctl restart docker 
    
  • 停止docker

    systemctl stop docker  
    
  • 其他

    ## 查看docker信息
    docker version
    
    ## 查看docker信息
    docker info
    
    ## docker-client
    which docker
    
    ## docker daemon
    ps -ef |grep docker
    
  • 查看本地镜像

    docker  images
    
  • 搜索镜像

    docker  search  镜像名
    
  • 拉取镜像

    docker  pull  镜像名
    

拉取时在dockerhub国外网站会很慢,设置加速器,类似于pip源,以后在docker中下载镜像时,使用加速器,下载就会比较快。

1.https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

在这里插入图片描述

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://ixmef0s2.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

2.https://www.daocloud.io/mirror#accelerator-doc

当centos提供请求时,转发到各个docker容器实现。

设置网口转发
cat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF


sysctl -p /etc/sysctl.d/docker.conf

3.docker使用实例

需求:

from flask import Flask

app = Flask(__name__)

@app.route("/index")
def index():
    return "欢迎光临红浪漫"

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8000)

3.1 下载镜像

步骤:

1.docker search ubuntu

或者上网站https://hub.docker.com/查找需要的镜像

在这里插入图片描述

2.docker pull ubuntu:18.04

3.docker images 查看镜像

这个只有基础镜像,我们可以在基础镜像的基础上创造出一个新的镜像:基础镜像 + 必备环境 + 代码

3.2 构建镜像

在宿主机cetos7创建Dockerfile和app.py文件

编写Dockerfile:

# Base images 基础镜像
FROM ubuntu:18.04

#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com

#RUN 执行以下命令
RUN apt update
RUN apt install python3  python3-pip  -y
RUN pip3 install flask
RUN mkdir -p /data/www/

#拷贝文件至工作目录
COPY app.py  /data/www/app.py

#工作目录
WORKDIR /data/www/

#EXPOSE 映射端口
EXPOSE 80

#容器启动时执行命令
CMD ["python3","app.py"]

构建镜像

 docker build  -t v0:0.1  .  -f Dockerfile 

在这里插入图片描述
在这里插入图片描述

使用此命令构建时,RUN中的下载会有缓存,执行docker build -t v0:0.2 . -f Dockerfile第二次构建时会使用之前RUN中的下载,不需要使用缓存就使用 docker build -t v0:0.1 . -f Dockerfile --no-cache

删除镜像docker rmi 镜像id

3.3 创建容器

1.基于刚构建的镜像,来创建容器并启动。

docker run 镜像名

在这里插入图片描述

将访问本机80转发到8000端口

docker run -p 80:8000 镜像id或名

在这里插入图片描述
在后台运行:不卡住界面,可以创建多个,会返回容器id

docker run -d -p 80:8000 镜像

在这里插入图片描述

指定容器名:

docker run -d -p 80:8000 --name 容器名 镜像 

通过宿主ip:80访问:
在这里插入图片描述

2.关闭容器

docker ps  												//显示运行容器
docker ps  -a  											//显示所有容器
docker stop 容器名/id/id前3//关闭容器
docker rm 容器id										     //删除容器
docker stop `docker ps -ap`								//批量停止
docker rm`docker ps -ap`								//批量删除

在这里插入图片描述
在这里插入图片描述
注意:容器必须有前台进程,否则创建就销毁,即CMD或者ENTRYPOINT中必须有执行界面卡住,宿主机执行时必须有后台进程,加上-d

那基础镜像都没有执行界面,就只能用于构建自己镜像吗?
也可以人为进入容器,实现有前台进程docker run -ti ubuntu:18.04 bashdocker run -ti ubuntu:18.04 sh,要实现退出后自动删除使用docker run -ti --rm ubuntu:18.04 sh

再次进入存货容器docker exec -ti 容器id bash

3.4 3.Dockerfile指令

Dockerfile是一堆指令,在docker build的时候,按照该指令进行操作,最终生成我们期望的镜像

  • FROM 指定基础镜像,必须为第一个命令

    格式:
    	FROM <image>
    	FROM <image>:<tag>
    示例:
    	FROM mysql:5.7
    注意:
    	tag是可选的,如果不使用tag时,会使用latest版本的基础镜像
    
  • MAINTAINER 镜像维护者的信息

    格式:
    	MAINTAINER <name>
    示例:
    	MAINTAINER wupeiqi
        MAINTAINER wupeiqi@live.com
        MAINTAINER wupeiqi <wupeiqi@live.com>
    
  • ENV

    格式:
        ENV <key> <value>
        ENV <key>=<value>
    示例:
        ENV myName John
        ENV myCat=fluffy
     指定环境变量后在其他地方使用$变量名使用
    
  • COPY|ADD 添加本地文件到镜像中 app.py /data/www/info/app.py

    格式:
    	COPY <src>... <dest>
    示例:
        ADD hom* /mydir/          # 添加所有以"hom"开头的文件
        ADD test relativeDir/     # 添加 "test" 到 $WORKDIR/relativeDir/
        ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
        
    注意:针对压缩包使用ADD的话,会自动解压。
    
  • WORKDIR 工作目录

    格式:
    	WORKDIR /path/to/workdir
    示例:
        WORKDIR /a  (这时工作目录为/a)
    注意:
    	通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
    
  • RUN 构建镜像过程中执行命令

    格式:
    	RUN <command>
    示例:
        RUN yum install nginx
        RUN pip install django
        RUN mkdir test && rm -rf /var/lib/unusedfiles
    注意:
    	RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
    
  • CMD 构建容器后调用,也就是在容器启动时才进行调用

    格式:
        CMD ["executable","param1","param2"] (执行可执行文件,优先)
        CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
        CMD command param1 param2 (执行shell内部命令)
    示例:
        CMD ["/usr/bin/wc","--help"]
        CMD ping www.baidu.com
    注意:
    	CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。CMD会被覆盖,只有最后一条有效或者当执行指令中指定时就不执行。
    
  • ENTRYPOINT 设置容器初始化命令,使其可执行化

    格式:
        ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
        ENTRYPOINT command param1 param2 (shell内部命令)
    示例:
        ENTRYPOINT ["/usr/bin/wc","--help"]
    注意:
    	ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
    
  • EXPOSE 暴漏端口

    格式:
        EXPOSE <port> [<port>...]
    示例:
        EXPOSE 80 443
        EXPOSE 8080
        EXPOSE 11211/tcp 11211/udp
    注意:
        就是一个端口的标识,实际开发时,没什么意义。因为端口的映射会在run命令时进行指定。
    

4.django项目部署实例

在这里插入图片描述

1.拉取镜像

docker pull centos:7.9.2009

2.编写Dockerfile

# Base images 基础镜像
FROM centos:7.6.1810

#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com


# GCC编译器
RUN yum install gcc -y

# Python依赖
RUN yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel  xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel  mysql-devel python-devel libffi-devel

# wget
RUN yum install wget -y

# 目录
RUN mkdir -p /data/
WORKDIR /data/

# SQLite升级
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz  --no-check-certificate
RUN tar -zxvf sqlite-autoconf-3420000.tar.gz
WORKDIR /data/sqlite-autoconf-3420000
RUN ./configure
RUN make && make install
ENV LD_LIBRARY_PATH="/usr/local/lib"

# Python3.9环境
WORKDIR /data/
RUN wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
RUN tar -xvf Python-3.9.5.tgz
WORKDIR /data/Python-3.9.5/
RUN ./configure
RUN make && make install
RUN pip3.9 config set global.index-url https://pypi.douban.com/simple/

# git
RUN yum install git -y
RUN git config --global user.name "lililimj"
RUN git config --global user.email "lililimj@qq.com"

# git拉代码
WORKDIR /data/
RUN git clone https://lililimj:Lmj763512\!@gitee.com/wupeiqi/blog.git


# 虚拟环境
RUN pip3.9 install virtualenv
RUN virtualenv  /envs/dj --python=python3.9
RUN /envs/dj/bin/pip3.9 install django==3.2

# 运行项目
WORKDIR /data/blog

CMD ["/envs/dj/bin/python","manage.py","runserver","0.0.0.0:9000"]

3.构建容器

docker build -t dj  .  -f Dockerfile
  1. 启动容器
# 测试启动
docker run -p 80:9000 --rm dj

# 正经启动
docker run -d -p 80:9000 dj

在这里插入图片描述

5.镜像导入导出和发布

后期在项目部署时,会经常使用:CentOS + Python3.9.5 的环境,为了避免每次都编译生成,我们可以自己制作一个【CentOS + Python3.9.5 】的基础镜像,便于后续使用。

Dockerfile

# Base images 基础镜像
FROM centos:7.6.1810

#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com


# GCC编译器
RUN yum install gcc -y

# Python依赖
RUN yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel  xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel  mysql-devel python-devel libffi-devel

# wget
RUN yum install wget -y

# 目录初始化
RUN mkdir -p /data/
WORKDIR /data/

# SQLite升级
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz  --no-check-certificate
RUN tar -zxvf sqlite-autoconf-3420000.tar.gz
WORKDIR /data/sqlite-autoconf-3420000
RUN ./configure
RUN make && make install
ENV LD_LIBRARY_PATH="/usr/local/lib"
RUN rm -rf /data/sqlite-autoconf-3420000*

# Python3.9环境
WORKDIR /data/
RUN wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
RUN tar -xvf Python-3.9.5.tgz
WORKDIR /data/Python-3.9.5/
RUN ./configure
RUN make && make install
RUN rm -rf /data/Python-3.9.5

RUN pip3.9 config set global.index-url https://pypi.douban.com/simple/

2.构建镜像

docker build -t  wupeiqi/centos76py39:v1  .  -f  Dockerfile

3.本地导出和导入

docker image save wupeiqi/centos76py39:1.0 > /data/centos76py39.tgz   #将镜像保存到本地/data/
docker image load -i /data/centos76py39.tgz   #将镜像从本地/data/下导入

4.发布
注册hub.docker.com账号

登录docker并上传镜像:注意在push时格式必须为dockerhub用户名/镜像名 ,否则会失败

docker login

docker push limeijing/centos76py39:1.0

#后续使用
docker pull limeijing/centos76py39:1.0

在这里插入图片描述
在这里插入图片描述

6. Django_uwsgi_nginx部署实例

在这里插入图片描述

7.开发机使用docker

win+docker:安装桌面版
mac+docker
在这里插入图片描述

拉取基础镜像,编写dockerfile,拉取代码等配置,构建后就能运行。
实现了在win上跑需要其他环境配置的代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值