https://www.cnblogs.com/uncleyong/p/8894133.html#_label0
在 Linux系统中常见一个 文件系统,可以通过创建多个镜像来实现各个项目之间的隔离,同时每个镜像之间都没有接口相同,沙箱处理
镜像是静态的定义, 容器是镜像的动态
docker容器数据持久化_小闫同学啊的博客-CSDN博客
# 运行容器进行测试,修改代码需要重新创建镜像很麻烦
# 通过持久化本地路径,修改本地代码达到同步修改容器内代码的效果
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
docker run -itd --name wg_manage -v E:\work\study\wg_manage\api:/opt/asp/wg_manage/api 42.194.147.234:10080/wg_manage:v1.0.0 /bin/bash
-itd:伪终端,并后台启动
--name:指定启动后的容器名称
-v:[宿主机目录]:[容器目录] [镜像名称] [命令(可选)] 宿主机目录必须是绝对路径,[容器目录] 必须真实存在的
使用Docker Registry快速搭建私有镜像仓库_嫩草终结者的博客-CSDN博客
下载镜像
docker pull registry
启动镜像,创建私人仓库
# 运行下载下来的registry镜像
docker run -itd -v /data/registry:/var/lib/registry -p 10080:5000 --restart=always --name registry registry:latest
"""
参数说明
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
--name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;
"""
# 查看镜像仓库中的所有镜像
curl http://127.0.0.1:10080/v2/_catalog
{"repositories":[]}
# 查看镜像仓库中的镜像版本
curl http://127.0.0.1:10080/v2/image_name/tags/list
登录测试
# 测试端
docker login 42.194.147.234:10080
admin/admin
打标签
docker tag wg_manage:v1.0.0 42.194.147.234:10080/wg_manage:v1.0.0
推送
docker push 42.194.147.234:10080/wg_manage:v1.0.0
查看个人仓库
# 查看镜像仓库中的所有镜像
# 进入仓库所在的服务器
curl http://127.0.0.1:10080/v2/_catalog
{"repositories":["wg_manage"]}
# 查看持久化文件
cd /data/registry/
执行容器:
docker run -i -t images:以交互式启动一个容器
docker run -d -i -t images:以后台形式启动
docker start container_id:启动容器
docker restart container_id:重启
docker stop container_id:停止容器
docker run -t -i --name xxx images :--name起别名
docker run -it --name 自定义容器名 -v 宿主机路径:容器内路径 镜像名
docker run -it --name ubt -v /root/docker_volume/ubuntu:/home/test ubuntu /bin/bash
此时在宿主机的路径下进行修改,则会通过修改容器中的数据,达到快速修改容器数据的作用
进入容器:
docker exec -i -t container_id command:进入容器或不进去直接输出结果
docker exec -i -t container_id ls -l /tmp:不进入容器,通过-t实现伪终端,查询/tmp下的文件
# 进入容器中,并执行 ls -l
docker exec -i -t container_id /bin/bash
ls -l
docker attach conta_id:进入容器(个人测试使用)
docker ps:列出所有正在执行的容器
列出所有容器:
查看日志:
查看容器内部情况:
复制容器文件到主机
docker cp container_id:容器中路径 目的主机路径
docker cp a90f2ba0cdfd:/opt/asp/vulscan/api/index.jap E:\var\log
复制主机文件到容器
docker cp index2.jap a90f2ba0cdfd:/opt/asp/vulscan/api
提交新的副本镜像
打包镜像
# 查看镜像的id
docker images
# 打包
docker save -o xxx.tar images_id
#复制到要部署的服务器上
# 加载
docker load < xxx.tar
官网上的镜像没有 vim
, ifconfig
, ll
,这是因为只使用内核,其他东西没有配置。自己构建镜像时添加。
FROM centos
ENV MYPATH /opt/asp
WORKDIR $MYPATH
RUN yum -y install vi
RUN yum -y install net-tools
EXPOSE 8080
CMD ["/bin/bash"]
FROM:基于哪个镜像
ENV:设置环境变量
WORKDIR:站脚点,进入容器的起始位置
CMD:镜像启动时执行的命令,并且只有最后一行CMD才会生效,同时如果启动时添加了命令则会覆盖Dockerfile中的CMD
docker run -it -p 80:8080 tomcat # 此时可以通过页面访问到
docker run -it -p 80:8080 tomcat ls -l # 此时容器不会启动,而是会执行 ls -l
# 原因是什么:ls -l 将容器中的 CMD指令覆盖了
ENTRYPOINT:和CMD效果一样,但是不会被覆盖,docker run
之后的参数被当成参数传递给 ENTERYPOINT
,追加形成新的命令组合
Docker是一个用于构建镜像的文本文件,
在目录下新建一个名为dockerfile 的文件
FROM python:3.6 # 定制的镜像都是基于FROM的镜像的,这里就是表示镜像是基于python3.6
# ENV 指定环境变量,便于后续使用
ENV PYTHONUNBUFFERED=1
ENV NPM_CONFIG_USER=0
ENV OPENSSL_CONF=/etc/ssl/
ENV LANG C.UTF-8
WORKDIR /opt/asp/echarts # 指定工作目录,会在构建进行的每一层中存在
RUN echo '这是一个本地构建的镜像' > usr/share/py.html # 用于执行跟在后面的命令行指令,等同于在shell命令
COPY chinese.msyh.ttf /usr/share/fonts/chinese.msyh.ttf #将本地 chinese.msyh.ttf 复制到镜像中的指定路径
COPY requirements.txt . # 将本地的requirements.txt 复制到镜像的指定路径 .
EXPOSE 8080 # 声明端口,帮助镜像使用者理解这个镜像复制的守护端口,以方便映射,在运行时使用随机端口映射时(docker run -P),会自动映射到EXPOSE 的端口
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"] # 在容器启动的时候执行,和RUN的区别就是 RUN 在docker build 时运行, CMD 在 docker run时执行 注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
注意: dockerfile的某些指令每执行一次都会在docker上新建一层,所以过多无意义的层,会造成镜像膨胀过大,列如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.g
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
在dockerfile文件的存放目录下,执行构建动作
docker build -t echarts:dev .
.
命令最后的.
是什么作用:这是一个上下文路径,docker在构建镜像,如果需要使用到本地文件(比如复制),docker build
命令得知这个路径后,会将路径下的所有内容打包
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
FROM python:3.6
ENV PYTHONUNBUFFERED=1
ENV NPM_CONFIG_USER=0
ENV OPENSSL_CONF=/etc/ssl/
# 中文
ENV LANG C.UTF-8
# 时区
ENV TZ=Asia/Shanghai \
DEBIAN_FRONTEND=noninteractive
WORKDIR /opt/asp/echarts
''' 待验证,是否有效
RUN apt-get update \
&& apt install -y tzdata \
&& ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone \
&& dpkg-reconfigure --frontend noninteractive tzdata \
&& rm -rf /var/lib/apt/lists/*
'''
RUN apt-get -y install curl gnupg
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get -y install nodejs
RUN apt-get -y install xfonts-wqy
RUN npm install -g phantomjs
# 字体
COPY chinese.msyh.ttf /usr/share/fonts/chinese.msyh.ttf
# 环境
COPY requirements.txt .
RUN pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 项目相关
COPY . .
# 对外端口
EXPOSE 8080
# 启动命令
# CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"]
CMD ["gunicorn", "echart.wsgi", "-c", "gunicorn.py"]
docker images
docker run -d echarts:dev
docker run -d -p 5000:8080 echarts:dev
docker stop contrainer_id
# 打标签
docker tag echarts:dev registry.paas/safebox-asp-controller/echarts:dev
# 登录远程
docker login registry.paas
# 推
docker push registry.paas/safebox-asp-controller/echarts:dev
#拉
docker pull registry.paas/safebox-asp-controller/echarts:dev
docker logs
命令,查看容器内的标准输出:docker logs 2b1b7a428627
docker logs amazing_cori
docker客户端使用,可以输入docker命令来查看到docker客户端的所有命令选项
docker
docker stats --help #查看stats的帮助文档
容器使用
docker -it ubuntu /bin/bash
参数说明:
退出容器
exit
启动已停止的容器
docker start b750bbbcfd88
后台运行
我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
docker run -itd --name ubuntu-test ubuntu /bin/bash
停止一个容器
docker stop <容器id>
重启一个容器
docker restart <容器id>
进入容器
docker exec -it 243c32535da7 /bin/bash
如果从这个容器退出,容器不会停止,这就是为什么推荐大家使用 docker exec 的原因。
删除容器
docker rm -f 1e560fca3906
1、管理和使用本地Docker主机镜像
2、创建镜像
列出镜像列表
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
training/webapp latest 6fae60ef3446 11 months ago 348.8 MB
参数说明:
同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:15.10 /bin/bash
参数说明:
如果要使用版本为 14.04 的 ubuntu 系统镜像来运行容器时,命令如下:
docker run -t -i ubuntu:14.04 /bin/bash
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
获取一个新的镜像
当我们在主机上使用一个不存在的镜像时,Docker会自动下载这个镜像,如果我们想预先下载这个镜像,可以使用docker pull
命令来下载他
docker pull ubuntu:13.10
13.10: Pulling from library/ubuntu
6599cadaf950: Pull complete
23eda618d451: Pull complete
f0be3084efe9: Pull complete
52de432f084b: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:15b79a6654811c8d992ebacdfbd5152fcf3d165e374e264076aa435214a947a3
Status: Downloaded newer image for ubuntu:13.10
查找镜像
我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: Docker
我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个 httpd 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
docker search httpd
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
拖取镜像
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
docker pull httpd
下载完成,使用镜像
docker run httpd
删除镜像
docker rmi hello-world
创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
docker run -i -t ubuntu:15.10 /bin/bash
在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
各个参数说明:
我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2:
docker images
使用我们的新镜像 runoob/ubuntu 来启动一个容器
docker run -t -i runoob/ubuntu:v2 /bin/bash
构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -t runoob/centos:6.7 .
参数说明:
我们可以使用新的镜像来创建容器
docker run -t -i runoob/centos:6.7 /bin/bash
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag 860c279d2fec runoob/centos:dev
使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
打包镜像 加载镜像
# 查看镜像的id
docker images
# 打包
docker save -o xxx.tar images_id
#复制到要部署的服务器上
# 加载
docker load < xxx.tar
导出和导入容器
docker export 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
导入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
删除容器
docker rm -f 1e560fca3906