Docker实战小记
来源:互联网 发布:济宁网络问政平台登录 编辑:程序博客网 时间:2024/03/29 03:24
docker小记
- docker小记
- 镜像
- 获取镜像
- 创建镜像
- 容器
- 仓库
- 公有仓库和自动创建
- 私有仓库
- 数据管理
- 数据卷
- 数据卷容器
- 利用数据卷容器迁移数据
- 网络基础配置
- 端口映射实现访问容器
- 容器互联实现容器间通信
- Dockerfile
- 基本结构
- 指令
- 创建镜像
- 案列
- 创建支持SSH服务的镜像
- 创建带apache2的镜像
- 附加
- 镜像
镜像:
获取镜像
docker运行容器前需要本地存在对应镜像,如果本地不存在,会尝试从默认镜像仓库下载(默认hub公共注册服务器的仓库)。
docker pull NAME[:TAG] : 不指定tag会默认使用 latest。
docker pull ubuntu:14.04//相当于:docker pull registry.hub.docker.com/ubuntu:latest
docker images:查看镜像信息。
- docker tag ubuntu chenqi :添加 tag
- docker inspect :查看镜像详细信息。
- docker search:搜寻镜像。
- docker rmi :删除镜像。 -f 强制删除。
创建镜像:
基于已有镜像的容器创建:docker commit [options] CONTAINER [repository[:TAG]], -a ,–author=作者信息,-m 提交信息, -p ,–pause=true提交时暂停容器运行。
docker commit -m '' -a '' 容器id 镜像名称
- 基于本地模板导入:cat ubuntu-14-minimal.tar.gz | docker import - ubuntu:14
存入和存出镜像:docker save 和 docker load
docker load --input ubuntu_14.tardocker load < ubuntu_14.tar
- 上传镜像:docker push NAME[:TAG],默认Hub官方仓库。
容器
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"
- exit 和 ctrl d 退出。
- docker stop:终止容器,docker stop [-t | –time[=10]]
- docker ps -a -q 查看终止的容器
- docker restart 重启。
- 进入容器:attach, exec, nsenter工具。
- docker rm [options] container [container … ] 。-f 强行删除运行中的。-l 删除链接,保留容器。-v 删除容器挂载的数据卷。
导入导出容器:docker export container 和 docker import 。
docker export 容器id > test_for_run.tar //导出 cat test_for_run.tar | docker import - test/ubuntu:v1
- docker load是导入镜像文件,docker import是导入容器快照,容器快照将丢弃所有容器历史记录和元数据信息。镜像文件将保存完整记录。
仓库
公有仓库和自动创建
- 自动创建:用户可以通过Docker Hub指定跟踪一个目标网站(目前支持github或bitbucker)上的项目,一旦发现新的提交,则自动执行创建。
- 创建并登陆Docker Hub,以及目标网站,在目标网站链接到Docker Hub。
- 在Docker Hub中配置一个自动创建。
- 选取一个目标网站中的项目(需包含Dockerfile)和分支。
- 指定Dockerfile的位置,并提交创建,之后,可以在Docker Hub的自动创建页面中跟踪状态。
私有仓库
安装docker后,可以通过官方registry镜像来搭建一套本地私有仓库。
docker run -d -p 5000:5000 registry //默认存放 /tmp/registrydocker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry//监听端口 5000
数据管理
数据卷
创建数据卷:
docker run -d -P --name web -v /webapp training/webapp(容器名称) python app.py//training/webapp 为容器名称//--name web 设置名称为web//-v 设置数据卷,多次使用-v可以设置多个数据卷// -P 允许外部访问容器的端口
也可以指定一个本地的已有目录到容器中作为数据卷:
docker run -d -P --name web -v /src/webapp:/opt/web training/webapp python app.py//加载主机的/src/webapp目录到容器的/opt/webapp目录//本地目录必须是绝对路径,如果目录不存在会自动创建
也可以挂载单个文件到容器中作为数据卷:
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
数据卷容器:
如果用户需要在容器中共享一些持续更新的数据,最简单的方式就是使用数据卷容器。
首先创建一个数据卷容器 dbdata,并在其中创建一个数据卷挂载到 /dbdata。
docker run -it -v /dbdata (-)-name dbdata ubuntu //会转义
可以在其他容器中使用 –volumes-from来挂载dbdata容器中的数据卷。
docker run -it --volumes-from dbdata --name db1 ubuntu //转义docker run -it --volumes-from dbdata --name db2 ubuntu三个容器任何一方在该目录下的写入,其他容器可以看到
还可以从其他已经挂载的容器卷的容器来挂载数据卷。
docker run -d --name db3 --volumes-from db1 training/postgres(容器名)
- 如果删除了挂载的容器(dbdata/db1/db2),数据卷不会自动删除,必须在删除最后一个还挂载这他的容器时显示使用 docker rm -v 来指定同时删除关联的容器。
利用数据卷容器迁移数据
备份:利用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
恢复:首先创建一个带有数据卷的容器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
网络基础配置
端口映射实现访问容器
外部访问应用时,可以通过 -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 //可以查看日志
映射所有接口地址
hostport:containerPortdocker run -d -p 5000:5000 ubuntu python app.py//本地5000映射到容器的5000 //默认绑定本地所有接口上的所有地址
映射到指定地址的任意端口:
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
- 查看映射端口配置: docker port ubuntu 5000
容器互联实现容器间通信
使用 –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 查看容器的连接。
使用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
基本结构
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
指令
- FROM < image > 或 FROM< image >:< tag > : 设置镜像
- MAINTAINER< name >:指定维护者信息
- RUN : 格式为 RUN < command > 或 RUN [“/bin/bash”,”-c”,”echo hello”],前者在shell中运行,即/bin/sh -c ;后者使用 exec 执行。命令较长时可以使用\换行。
- CMD支持三种方式:
- CMD [“executable”, “param1” , “param2” ] 使用exec执行,推荐方式
- CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用。
- CMD [“param1”,”param2”] 提供给 ENTRYPOINT的默认参数。
- 指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
- EXPOSE: EXPOSE < port > [< port >] :,例如 EXPOSE 22 80 8433,高速Docker服务端暴露的端口号,供互联系统使用。在启动容器时需要通过-P或-p指定。
- ENV < key > < value >。 指定一个环境变量,会被后续RUN指定使用。使用时,$变量名即可。
- ADD < src > < dest > 。 该命令将复制指定的 < src > 到容器的 < dest >。其中 src 可以是 Dockfile所在目录的相对路径,也可以是个URL,或者tar文件(自动解压)。
- COPY < src > < dest >。复制本地主机的 src(Dockfile所在目录的相对路径,文件或目录)为容器的 dest 。目标路径不存在时,会自动创建。
- ENTRYPOINT : 配置容器启动后执行的命令,不可被 docker run提供的参数覆盖,每个Dockerfile只能有一个ENTRYPOINT
- ENTRYPOINT [“executable”, “param1”, “param2”]
- ENTRYPOINT command, param1, param2 (shell中执行) 3.
- VOLUME [“/data”] 。创建一个可以从本地或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
- WORKDIR /path/to/workdir。 为后续的 RUN/CMD/ENTRYPOINT 指令配置工作目录。可以使用多个,后续命令中如果有相对路径,将基于之前命令指定的路径。
ONBUILD [INSTRUCTION] :配置当创建的镜像为其他新创建的镜像的基础镜像时,所执行的操作指令。比如先 创建了 A , B 基于A 。
ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dir /app/src
13.
创建镜像
- docker build [opt] 路径, 该命令会读取指定路径下的Dockerfile,并将所有文件发送给服务端,由服务端创建镜像,一次建议为空目录。
可以通过 .dockerignore文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
docker build -t build_repo/first_image /tmp/docker_builder///build_repo/first_image 镜像标签///tmp/docker_builder/ Dockerfile所在目录
案列
创建支持SSH服务的镜像
- docker run -it –name web ubuntu;
- apt-get update //更新缓存
- apt-get install openssh-server
- mkdir -p /var/run/sshd //要正常启动需要这个文件夹
- /usr/sbin/sshd -D &
- netstat -tunlp
- vim /etc/pam.d/sshd
修改 #session required pam_loginuid.so- mkdir ~/.ssh
- vim .ssh/authorized_keys
- vim /run.sh
#! /bin/bash
/usr/sbin/sshd -D- chmod +x /run.sh
- exit;
- 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
注意:会继承父镜像端口,但不会继承启动命令。
附加
- docker search -s 10 ubuntu 只显示被收藏10次以上的。
- Docker实战小记
- Docker小记
- Docker 小记
- Docker小记
- docker实战
- docker 实战
- docker实战 - docker简介
- 【docker】Docker实战
- Docker实战-Docker Daemon
- Docker 常用命令小记
- Docker命令小记。
- ftp 实战问题小记
- docker 小记(一)
- 【实战】Docker容器资源管理
- Docker入门实战
- Docker入门实战
- docker实战文章收集
- Docker 监控实战
- 登录界面及记住密码的实现
- CSS"盒子模型"
- Spring配置文件报Referenced file contains errors :beans/factory/xml/spring-beans-4.3.xsd
- [C++](转载)虚函数表解析
- marquee实现文字滚动效果
- Docker实战小记
- [深度学习论文笔记][ECCV 16]Embedding Deep Metric for Person Re-identication A Study Against Large Variations
- 项目搭建中的遇到的问题
- opencv 鼠标选取图像感兴趣区域
- 存储登录密码及账号
- 爬虫学习日记二:相关图片的爬取(附代码)
- 面向对象高级( 随手记-4)
- 从np.random.normal()到正态分布的拟合
- 矩阵计算一些重要的结论及其证明