Docker实战小记

来源:互联网 发布:济宁网络问政平台登录 编辑:程序博客网 时间:2024/03/29 03:24

docker小记

  • docker小记
    • 镜像
        • 获取镜像
        • 创建镜像
    • 容器
    • 仓库
        • 公有仓库和自动创建
        • 私有仓库
    • 数据管理
        • 数据卷
        • 数据卷容器
        • 利用数据卷容器迁移数据
    • 网络基础配置
        • 端口映射实现访问容器
        • 容器互联实现容器间通信
    • Dockerfile
        • 基本结构
        • 指令
        • 创建镜像
    • 案列
        • 创建支持SSH服务的镜像
        • 创建带apache2的镜像
    • 附加

镜像:

获取镜像

docker运行容器前需要本地存在对应镜像,如果本地不存在,会尝试从默认镜像仓库下载(默认hub公共注册服务器的仓库)。

  1. docker pull NAME[:TAG] : 不指定tag会默认使用 latest。

    docker pull ubuntu:14.04//相当于:docker pull registry.hub.docker.com/ubuntu:latest
  2. docker images:查看镜像信息。

  3. docker tag ubuntu chenqi :添加 tag
  4. docker inspect :查看镜像详细信息。
  5. docker search:搜寻镜像。
  6. docker rmi :删除镜像。 -f 强制删除。

创建镜像:

  1. 基于已有镜像的容器创建:docker commit [options] CONTAINER [repository[:TAG]], -a ,–author=作者信息,-m 提交信息, -p ,–pause=true提交时暂停容器运行。

    docker commit -m '' -a '' 容器id 镜像名称
  2. 基于本地模板导入:cat ubuntu-14-minimal.tar.gz | docker import - ubuntu:14
  3. 存入和存出镜像:docker save 和 docker load

    docker load --input ubuntu_14.tardocker load < ubuntu_14.tar
  4. 上传镜像:docker push NAME[:TAG],默认Hub官方仓库。

容器

  1. docker create : 创建容器。

    docker create -it ubuntu:latestdocker ps -a docker start 容器id//新建并启动docker run ubuntu /bin/echo 'hello world'//输出hello world后立即停止。-t 分配一个伪终端-i 让终端始终开起-d 守护状态docker run -d /bin/sh -c "while true; do echo hello; sleep 1; done"
  2. exit 和 ctrl d 退出。
  3. docker stop:终止容器,docker stop [-t | –time[=10]]
  4. docker ps -a -q 查看终止的容器
  5. docker restart 重启。
  6. 进入容器:attach, exec, nsenter工具。
  7. docker rm [options] container [container … ] 。-f 强行删除运行中的。-l 删除链接,保留容器。-v 删除容器挂载的数据卷。
  8. 导入导出容器:docker export container 和 docker import 。

        docker export 容器id > test_for_run.tar  //导出    cat test_for_run.tar | docker import - test/ubuntu:v1
  9. docker load是导入镜像文件,docker import是导入容器快照,容器快照将丢弃所有容器历史记录和元数据信息。镜像文件将保存完整记录。

仓库

公有仓库和自动创建

  1. 自动创建:用户可以通过Docker Hub指定跟踪一个目标网站(目前支持github或bitbucker)上的项目,一旦发现新的提交,则自动执行创建。
    1. 创建并登陆Docker Hub,以及目标网站,在目标网站链接到Docker Hub。
    2. 在Docker Hub中配置一个自动创建。
    3. 选取一个目标网站中的项目(需包含Dockerfile)和分支。
    4. 指定Dockerfile的位置,并提交创建,之后,可以在Docker Hub的自动创建页面中跟踪状态。

私有仓库

  1. 安装docker后,可以通过官方registry镜像来搭建一套本地私有仓库。

    docker run -d -p 5000:5000 registry //默认存放 /tmp/registrydocker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry//监听端口 5000

数据管理

数据卷

  1. 创建数据卷:

    docker run -d -P --name web -v /webapp training/webapp(容器名称) python app.py//training/webapp 为容器名称//--name web  设置名称为web//-v 设置数据卷,多次使用-v可以设置多个数据卷// -P 允许外部访问容器的端口
  2. 也可以指定一个本地的已有目录到容器中作为数据卷:

    docker run -d -P --name web -v /src/webapp:/opt/web training/webapp python app.py//加载主机的/src/webapp目录到容器的/opt/webapp目录//本地目录必须是绝对路径,如果目录不存在会自动创建
  3. 也可以挂载单个文件到容器中作为数据卷:

    docker  run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

数据卷容器:

如果用户需要在容器中共享一些持续更新的数据,最简单的方式就是使用数据卷容器。

  1. 首先创建一个数据卷容器 dbdata,并在其中创建一个数据卷挂载到 /dbdata。

    docker run -it -v /dbdata (-)-name dbdata ubuntu  //会转义
  2. 可以在其他容器中使用 –volumes-from来挂载dbdata容器中的数据卷。

    docker  run -it --volumes-from dbdata --name db1 ubuntu //转义docker  run -it --volumes-from dbdata --name db2 ubuntu三个容器任何一方在该目录下的写入,其他容器可以看到
  3. 还可以从其他已经挂载的容器卷的容器来挂载数据卷。

    docker run -d --name db3 --volumes-from db1 training/postgres(容器名)
  4. 如果删除了挂载的容器(dbdata/db1/db2),数据卷不会自动删除,必须在删除最后一个还挂载这他的容器时显示使用 docker rm -v 来指定同时删除关联的容器。

利用数据卷容器迁移数据

  1. 备份:利用Ubuntu创建一个容器worker。使用–volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷;使用-v $(pwd):backup参数股灾本地目录到worker容器的/backup目录。 worker启动后,使用tar cvf /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的 /backup/backup.tar

    docker run --volumes-from dbdata -v $(pwd):backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
  2. 恢复:首先创建一个带有数据卷的容器dbdata2,然后创建另一个新的容器,挂载dbdata2的容器,使用untar解压备份文件到所挂载的容器卷。

    docker run -v /dbdata --name dbdata2 ubuntu /bin/bashdocker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

网络基础配置

端口映射实现访问容器

  1. 外部访问应用时,可以通过 -P 和 -p 参数来指定端口映射。当使用 -P 标记时,Docker会随机映射一个49000-49900的端口至容器内部开放的网络端口。

    docker run -d -P ubuntu python app.pydocker ps -l0.0.0.0:49155->5000/tcp //本地49155docker logs -f ubuntu //可以查看日志
  2. 映射所有接口地址

    hostport:containerPortdocker run -d -p 5000:5000 ubuntu python app.py//本地5000映射到容器的5000 //默认绑定本地所有接口上的所有地址
  3. 映射到指定地址的任意端口:

    ip::containerPort 绑定localhost的任意端口到容器的5000docker run -d -p 127.0.0.1::5000 ubuntu python app.py可以使用udp标记指定udp端口docker run -d -p 127.0.0.1:5000:5000/udp ubuntu python app.py
  4. 查看映射端口配置: docker port ubuntu 5000

容器互联实现容器间通信

  1. 使用 –link可以让容器之前安全的进行交互。两个互联的容器之间创建了一个安全隧道,不用映射端口。

        docker run -d --name db ubuntu  //创建一个db    docker run -d -P --name web --link db:db ubuntu python app.py //创建一个web    --link的格式: --link name:alias, name是容器的名称,alias是连接的别名。    docker ps 查看容器的连接。
  2. 使用env命令来查看web容器的环境变量。

    docker run --rm --name web2 --link db:db ubuntu env//例如:DB_NAME=/web2/dbDB_PORT=tcp://172.17.0.5:5432......DB_开头的环境变量是供web容器连接db使用docker run -t -i --rm --link db:db ubuntu /bin/bashcat /etc/hosts//例如:172.17.0.7 dsj324sf172.17.0.5 db第一个是web容器,web容器用自己id作为默认主机名,第二个是db容器的ip和主机名。可以在web容器中Ping通。

Dockerfile

基本结构

  1. Dockerfile分为四部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令。

    #注释#第一行必须指定基础镜像FROM ubuntu#维护者信息#MAINTAINER docker_user docker@email.com#镜像操作指令RUN echo "deb http://archive.ubuntu.com/ubuntu/ ">>/etc/apt/sources.listRUN apt-get update && apt-get install -y nginxRUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf#容器启动时执行指令CMD /usr/sbin/nginx

指令

  1. FROM < image > 或 FROM< image >:< tag > : 设置镜像
  2. MAINTAINER< name >:指定维护者信息
  3. RUN : 格式为 RUN < command > 或 RUN [“/bin/bash”,”-c”,”echo hello”],前者在shell中运行,即/bin/sh -c ;后者使用 exec 执行。命令较长时可以使用\换行。
  4. CMD支持三种方式:
    1. CMD [“executable”, “param1” , “param2” ] 使用exec执行,推荐方式
    2. CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用。
    3. CMD [“param1”,”param2”] 提供给 ENTRYPOINT的默认参数。
    4. 指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
  5. EXPOSE: EXPOSE < port > [< port >] :,例如 EXPOSE 22 80 8433,高速Docker服务端暴露的端口号,供互联系统使用。在启动容器时需要通过-P或-p指定。
  6. ENV < key > < value >。 指定一个环境变量,会被后续RUN指定使用。使用时,$变量名即可。
  7. ADD < src > < dest > 。 该命令将复制指定的 < src > 到容器的 < dest >。其中 src 可以是 Dockfile所在目录的相对路径,也可以是个URL,或者tar文件(自动解压)。
  8. COPY < src > < dest >。复制本地主机的 src(Dockfile所在目录的相对路径,文件或目录)为容器的 dest 。目标路径不存在时,会自动创建。
  9. ENTRYPOINT : 配置容器启动后执行的命令,不可被 docker run提供的参数覆盖,每个Dockerfile只能有一个ENTRYPOINT
    1. ENTRYPOINT [“executable”, “param1”, “param2”]
    2. ENTRYPOINT command, param1, param2 (shell中执行)
    3. 3.
  10. VOLUME [“/data”] 。创建一个可以从本地或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
  11. WORKDIR /path/to/workdir。 为后续的 RUN/CMD/ENTRYPOINT 指令配置工作目录。可以使用多个,后续命令中如果有相对路径,将基于之前命令指定的路径。
  12. ONBUILD [INSTRUCTION] :配置当创建的镜像为其他新创建的镜像的基础镜像时,所执行的操作指令。比如先 创建了 A , B 基于A 。

    ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src
  13. 13.

创建镜像

  1. docker build [opt] 路径, 该命令会读取指定路径下的Dockerfile,并将所有文件发送给服务端,由服务端创建镜像,一次建议为空目录。
  2. 可以通过 .dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。

    docker build -t build_repo/first_image /tmp/docker_builder///build_repo/first_image 镜像标签///tmp/docker_builder/  Dockerfile所在目录

案列

创建支持SSH服务的镜像

  1. docker run -it –name web ubuntu;
  2. apt-get update //更新缓存
  3. apt-get install openssh-server
  4. mkdir -p /var/run/sshd //要正常启动需要这个文件夹
  5. /usr/sbin/sshd -D &
  6. netstat -tunlp
  7. vim /etc/pam.d/sshd
    修改 #session required pam_loginuid.so
  8. mkdir ~/.ssh
  9. vim .ssh/authorized_keys
  10. vim /run.sh
    #! /bin/bash
    /usr/sbin/sshd -D
  11. chmod +x /run.sh
  12. exit;
  13. docker commit -a ‘作者’ -m ‘信息’ chenqi(容器名) ssh:ubuntu 名字和Tag

创建带apache2的镜像

Dockerfile

#使用之前sshd镜像FROM sshd:ubuntu  MAINTAINER waitfish from chenqi by chenqiENV DEBIAN_FRONTEND noninteractiveRUN apt-get -yq install apache2 &&\        rm -rf /var/lib/apt/lists/*RUN echo "Asia/Shanghai" > /etc/timezone && \        dpkg-reconfigure -f noninteractive tzdataADD run.sh /run.shRUN chmod 755 /*.shRUN mkdir -p /var/lock/apache2 && mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/htmlCOPY sample/ /appENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_LOG_DIR /var/log/apache2ENV APACHE_PID_FILE /var/run/apache2.pidENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_SERVERADMIN admin@localhostENV APACHE_SERVERNAME localhostENV APACHE_SERVERALIAS docker.localhostENV APACHE_DOCUMENTROOT /var/wwwEXPOSE 80WORKDIR /appCMD ["/run.sh"]

docker build -t apache:ubuntu .

#!/bin/bash/usr/sbin/sshd -Dexec apache2 -D FOREGROUND#/etc/init.d/apache2 start

注意:会继承父镜像端口,但不会继承启动命令。

附加

  1. docker search -s 10 ubuntu 只显示被收藏10次以上的。
0 0
原创粉丝点击