下面是学习docker的一些笔记,主要参考书籍是docker从入门到实践。
<h6>docker镜像基本操作
拉取
<code>docker pull ubuntu:12.04</code>
<code>docker pull dl.dockerpool.com:5000/ubuntu:12.04</code>列出images
<code>docker images</code>启动一个容器
<code>docker run -i -t ubuntu:14.04 /bin/bash</code>创建镜像
1.创建已有镜像
<code>docker commit -m "Added json gem" -a Docker Newbee" 0b2616b0e5a8 centos:v2</code>
-m 指定注释信息
-a 指定更新的使用者信息
Container ID
tag名称
2.利用Dockerfile建立映像档
<code>$ mkdir tiantian</code>
<code>$ cd tiantian </code>
<code>$ touch dockerfile</code>
<code>$vim dockerfile </code>
<pre>FROM ubuntu:14.04
MAINTAINER tiantian
RUN mkdir /home/tiantian</pre>
<code>$ docker build -t="ubuntu:v3" .</code>
注意:"."是dockerfile所在的路径(当前目录)
dockerfile 基本语法再下面章节中具体介绍。
3.将安装后的容器保存为镜像
<code>docker commit Container_ID centos:v2</code>
4.从本地导入
使用OpenVZ容器虛擬化的先鋒技術的模板來建立 http://openvz.org/Download/templates/precreated
<code>cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04</code>
5.docker tag 修改映像档的标签
<code>docker tag IMAGE_ID centos:v3</code>
6.上传镜像文档
<code>docker push</code>
7.导出镜像文件到本地
<code>docker save -o ubuntu_14.04.tar ubuntu:14.04</code>
8.从本地文件导入到本地镜像仓库
<code>docker load < ubuntu_14.04.tar</code>
9.移除本地镜像
<code>docker rmi</code>
注意:在移除镜像之前需要<code>docker rm</code>删除掉依赖于这个镜像的所有容器
10.清理所有未打过标签的本地镜像
<code>docker rmi $(docker images -q -f "dangliang=true")</code>
<h6>docker 容器基本操作
1.启动容器
<code>docker run -i -t ubuntu:14.04 /bin/bash</code>
-t 让docker分配一个伪终端并绑定到容器的标准输入上
-i 让容器的标注输入保持打开
<pre>docker在后台运行的标准操作包括:
利用镜像创建并启动一个容器
分配一个文件系统
并在只读的镜像层外面挂载一层读写层
从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池分配一个ip地址给容器
执行用户指定的应用容器
执行完毕容器被终止 </pre>
2.启动已终止的容器
<code>docker start Container_ID </code>
3.后台运行
<code>docker run -d ubuntu:14.04 /bin/bash -C "while true;do echo hello_docker;sleep 1;done"</code>
-d 让docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下
4.终止容器
<code>docker stop Container_ID</code>
终止状态的容器可以使用<code>docker ps -a</code>查看
5.进入容器
attach 命令
<code>docker attach Conntainer_Name</code>
使用attach命令有时不方便。当多个窗口同时attach到同一个容器时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作了exec 命令
<code>docker exec Container_ID /bin/bash</code>nsenter(需安装)
<pre></code>$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin</code></pre>
example:
<pre>$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
$ docker inspect --format "{{ .State.Pid }}" <container-id>
10981
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#</pre>
4)shell脚本实现
<pre>$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
這個檔案中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以取得某個容器的 PID;
而 docker-enter 可以進入容器或直接在容器內執行命令。
$ echo $(docker-pid <container>)
$ docker-enter <container> ls</pre>
6.导出容器快照到本地文件
<code>docker export Container_ID > ubuntu.tar</code>
7.导入容器快照
<code>cat ubuntu.tar | docker import - test/ubuntu:v1.0</code>
8.清理所有终止状态的容器
<code>docker rm $(docker ps -a -q)</code>
<h6>私有仓库的搭建
安装
<pre>Centos:
$ sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel
$ sudo python-pip install docker-registry
$ cp config/config_sample.yml config/config.yml
修改config.yml配置文件中dev模板段的storage_path
启动web服务
sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
用curl访问本地的5000端口,看到输出 docker-registry的版本信息说明运行成功</pre>在私有倉庫上傳、下載、搜索映像檔
<code>docker tag ba58 192.168.7.26:5000/test</code>
格式為 <code>docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]</code>用 curl 查看倉庫中的映像檔
<code>curl http://192.168.7.26:5000/v1/search</code>
可以使用 下面這個腳本 批次上傳本地的映像檔到註冊伺服器中,預設為本地註冊伺服器 127.0.0.1:5000
示例 ./push_images.sh ubuntu:latest centos:centos7
<pre>#The registry server address where you want push the images into
registry=127.0.0.1:5000
DO NOT MODIFY THE FOLLOWING PART, UNLESS YOU KNOW WHAT IT MEANS
echo_r () {
[ $# -ne 1 ] && return 0
echo -e "\033[31m$1\033[0m"
}
echo_g () {
[ $# -ne 1 ] && return 0
echo -e "\033[32m$1\033[0m"
}
echo_y () {
[ $# -ne 1 ] && return 0
echo -e "\033[33m$1\033[0m"
}
echo_b () {
[ $# -ne 1 ] && return 0
echo -e "\033[34m$1\033[0m"
}
usage() {
sudo docker images
echo "Usage: $0 registry1:tag1 [registry2:tag2...]"
}
[ $# -lt 1 ] && usage && exit
echo_b "The registry server is $registry"
for image in "$@"
do
echo_b "Uploading $image..."
sudo docker tag $image $registry/$image
sudo docker push $registry/$image
sudo docker rmi $registry/$image
echo_g "Done"
done</pre>
<h6>docker数据卷管理(docker内部及容器之间的管理数据)
数据卷
数据卷是一个可供一个或多个容器使用的特殊目录
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新,不会影响镜像
数据卷默认会一直存在,即使容器删除
类似于Linux下对目录或文件进行的mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示的是挂载的数据卷
创建一个数据卷
创建一个web容器,并创建一个数据卷到容器的/webapp目录
<code>docker run -i -t --name web -v /webapp centos:6</code>
-v:创建一个数据卷并挂载到容器里挂载一个主机目录作为容器卷
<code>dicker run -d -i -t --name web_1 -v /src/webapp:/opt/webapp centos:6</code>
-v 也可以指定挂载一个本地主机的目录到容器中去
本地主机目录 /src/webappDocker挂载数据卷的默认权限是读写,用户也可以通过:ro指定为只读
<code>docker run -d -i -t --name web_1 -v /src/webapp:/opt/webapp:ro centos:6 </code>删除数据卷
在删除容器的时候使用<code>docker rm -v</code>命令
数据卷是被设计用来作持久化数据的,它的生命周期独立于容器,docker不会再容器被删除后自动删除数据卷,并且也不会存在垃圾回收这样的机制来处理没有任何容器引用的数据卷查看数据卷的具体信息
<code>docker inspect Container_Name</code>
在输出的内容中找到其中和数据卷相关的部分数据卷容器
数据卷容器,其实是一个正常的容器,专门用来提供数据卷供其它容器挂载
<pre>#建立一个叫dbdata的数据卷容器
$ docker run -d -i -t -v /dbdata --name dbdata centos:6
在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷
$ docker run -d --name db1 --volumes-from dbdata centos:6
注意:使用--volumes-from参数挂载数据卷的容器自己并不需要保持在运行状态
可以使用多个 --volumes-from参数来从多个容器挂载多个数据卷,也可以从其他已经挂载了容器卷的容器来挂载数据卷
$ docker run -d --name db2 --volumes-from db1 centos:6 </pre>利用数据卷容器来备份/恢复/迁移数据卷
备份
使用--volumes-from标记来创建一个加载dbdata容器卷的容器,并从本地主机挂载当前目录到容器的/backup目录
<code>docker run -d -i -t --volumes-from dadata -v $(pwd):/backup centos:6 tar cvf /backup/backup.tar /dbdata</code>恢复
如果要恢复数据到一个容器,首先创建一个带有数据卷的容器dbdata2
<code>docker run -i -t -d -v /dbdata --name dbdata2 centos:6 /bin/bash</code>
然后创建另一个容器,挂载dbdata2的容器卷,并使用untar解压备份文件到挂载的容器卷中
<code>docker run -i -t -d --volumes-from dbdata2 -v $(pwd):/backup centos:6 tar xvf /backup/backup.tar</code>
<h6>docker file中网络功能介绍(端口映射)
外部访问容器
通过-p或-P参数来指定端口的映射
-p 指定要映射的端口并且在一个指定端口上只可以绑定一个容器
-P 随机映射以恶49000~49900的端口到内部容器开放的端。
格式
<code>ip:hostPort:containerPort | ip::containerPort| hostport:containerPort</code>查看映射端口
<code>docker port Container_Port</code>
<h6>Dockerfile基本结构
Dockerfile 分为四部分:基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。
指令参数
<pre>FROM <image>:<tag>
第一条指令必须为 FROM 指令。如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM
指令( 每个镜像一次 )
</p>
MAINTAINER
MAINTAINER ,指定维护者信息
RUN
RUN <command> 或 RUN ["executable", "param1", "param2"]
RUN ["/bin/bash", "-c", "echo hello"]
</p>
CMD
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令, 每个 Dockerfile 只能有一条 CMD 命令。 如果指定了多条命令, 只有最后一
条会被执行
如果用户启动容器时候指定了运行的命令, 则会覆盖掉 CMD 指定的命令
</p>
EXPOSE
EXPOSE port
告诉 Docker 服务端容器暴露的端口号, 供互联系统使用。 在启动容器时需要通过 -P, Docker 主机会自动
分配一个端口转发到指定的端口。
</p>
ENV
ENV key value
指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。
</p>
VOLUME
VOLUME ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点
</p>
ENTRYPOINT
ENTRYPOINT ["executable", "param1", "param2"]
配置容器启动后执行的命令, 并且不可被 docker run 提供的参数覆盖。
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效
</p>
ADD
ADD src dest
该命令将复制指定的 <src> 到容器中的 <dest>。 其中 <src> 可以是Dockerfile所在目录的一个相对路径;也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。
</p>
COPY
格式为 COPY src dest
复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的
<dest>。
当使用本地目录为源目录时,推荐使用 COPY。
</p>
需要注意:
ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记
CMD,表示镜像运行默认参数,可被重写覆盖.
ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!</pre>
<h6>上面的都是一些常用的docker知识,更多详细内容还是得看资料。推荐<<我的第一本docker书>。
作者:Tianny在杭州
链接:https://www.jianshu.com/p/34dd724b7ef8
共同学习,写下你的评论
评论加载中...
作者其他优质文章