docker小记
镜像:
获取镜像
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.tar docker load < ubuntu_14.tar
- 上传镜像:docker push NAME[:TAG],默认Hub官方仓库。
容器
docker create : 创建容器。
docker create -it ubuntu:latest docker 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/registry docker 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/bash docker 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.py docker ps -l 0.0.0.0:49155->5000/tcp //本地49155 docker logs -f ubuntu //可以查看日志
映射所有接口地址
hostport:containerPort docker run -d -p 5000:5000 ubuntu python app.py //本地5000映射到容器的5000 //默认绑定本地所有接口上的所有地址
映射到指定地址的任意端口:
ip::containerPort 绑定localhost的任意端口到容器的5000 docker 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/db DB_PORT=tcp://172.17.0.5:5432 ...... DB_开头的环境变量是供web容器连接db使用 docker run -t -i --rm --link db:db ubuntu /bin/bash cat /etc/hosts //例如: 172.17.0.7 dsj324sf 172.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.list RUN apt-get update && apt-get install -y nginx RUN 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/src ONBUILD 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 chenqi
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -yq install apache2 &&\
rm -rf /var/lib/apt/lists/*
RUN echo "Asia/Shanghai" > /etc/timezone && \
dpkg-reconfigure -f noninteractive tzdata
ADD run.sh /run.sh
RUN chmod 755 /*.sh
RUN mkdir -p /var/lock/apache2 && mkdir -p /app && rm -rf /var/www/html && ln -s /app /var/www/html
COPY sample/ /app
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www
EXPOSE 80
WORKDIR /app
CMD ["/run.sh"]
docker build -t apache:ubuntu .
#!/bin/bash
/usr/sbin/sshd -D
exec apache2 -D FOREGROUND
#/etc/init.d/apache2 start
注意:会继承父镜像端口,但不会继承启动命令。
附加
- docker search -s 10 ubuntu 只显示被收藏10次以上的。