初识docker
docker在开发和运维中的优势:
1)更快速的交付和部署
2)更高效的资源利用
3)更轻松的迁移和扩展
4)更简单的更新管理
docker与虚拟机的比较
docker的核心概念和安装
docker镜像:镜像(image)是创建docker容器的基础,类似于虚拟机镜像,一个面向docker引擎的只读模板,包含了文件系统。
docker容器:(container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用.可以看做一个简易版得到liux系统。可以对容器进行启动,开始,停止,删除。
docker仓库:docker仓库类似于代码库,是docker集中存放镜像的文件场所。
镜像
获取镜像
$sudo docker pull NAME[:TAG] 不显式指定tag号,默认使用latest标签。 e.g. $ sudo docker pull ubuntu: 14.04
指定仓库下载镜像并启动容器:$ sudo docker pull dl.dockerpool.com:5000/ubuntu $ sudo docker run -t -i ubuntu /bin/bash
查看镜像信息
查看本地镜像信息:$ sudo docker images
修改本地镜像标签:$ sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
获取镜像的详细信息,以JSON返回:$ sudo docker inspect 5506de2b643b inspect后面+镜像ID
搜寻镜像
用 docker search 命令可以搜索远端仓库中共享的镜像,默认搜索 Docker Hub 官
方仓库中的镜像。用法为 docker search TERM 。
删除镜像
使用镜像标签删除镜像
$ sudo docker rmi dl.dockerpool.com:5000/ubuntu
注意:当同一个镜像拥有多个标签的时候, docker rmi 命令只是删除了该镜像多个标签中的指定
标签而已,并不影响镜像文件。但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi 命令会彻底删
除该镜像 。
创建镜像
基于已有镜像的容器创建
命令格式为 docker commit [OPTIONS]
CONTAINER [REPOSITORY[:TAG]],主要选项包括:
-a, --author="" 作者信息。
-m, --message="" 提交消息。
-p, --pause=true 提交时暂停容器运行。
e.g. $ sudo docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test 其中a925cb40b3f0 为容器ID
基于本地模板导入
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
基于dockerfile
存出和载入镜像
可以使用 docker save 和 docker load 命令来存出和载入镜像。
上传镜像
$ sudo docker tag test:latest user/test:latest
$ sudo docker push user/test:latest
容器
新建容器
Sudo Docker create -it ubuntu:latest
Sudo docker start 容器ID
启动容器
Sudo docker run -t -i ubuntu /bin/bash
Ctrl+p ctrl+q 后台运行 exit 退出
守护态运行
Sudo docker logs 容器ID
终止容器
Sudo docker stop/restart/start 容器ID
进入容器
删除容器
-f
数据管理
数据卷
数据卷容器
1)创建一个数据卷容器dbdate 然后创建一个数据卷挂载到 /dbdata
数据备份
网络基础配置
使用dockerfile创建镜像
Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。
基础结构
一般而言,dockerfile分为字部分:基础镜像信息,维护者信息,镜像操作指令和容器启动时执行指令。 # This dockerfile uses the ubuntu image #VERSION 2 - EDITION 1 #Author:docker_user #Command format: Instruction [arguments/command] #第一行必须指定基础镜像 FROM shc-harbor-dev.hpeswlab.net/itsma/itom-itsma-opensuse-base:2017.04.26 #维护者信息 MAINTAINER docker_user docker_user@email.com #镜像的操作指令 每运行一次RUN命令,镜像添加新的一层,并提交。 RUN echo "deb http:// archive.ubuntu.com" >> /etc/apt/sources.list RUN apt-get update && apt-get install -y nginx RUN echo " daemon off;" >> /etc/nginx/nginx.conf #容器启动时执行指令 CMD /usr/sbin/nginx
指令
1.FROM
第一条指令必须为FROM指令。如果同个Dockerfile中创建多个镜像,可以使用多个FROM指令。
格式FROM <image> 或 FROM <image>:<tag>
2.MAINTAINER
格式为 MAINTAINER <name>,指定维护者信息。
3.RUN
格式为RUN <command>
每条RUN指令将在当前镜像基础上执行命令,并提交为新的镜像。当命令较长时可以使用来换行。
4.CMD
CMD 指令的格式和 RUN 相似,也是两种格式:
- shell 格式:CMD <命令>
- exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
- 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
5.EXPOSE
告诉docker服务端容器暴露的端口号,供互联系统使用。使用-p指定主机端口映射。
EXPOSE 22 80 8443
docker run -d -p 127.0.0.1:33301:22 centos6-ssh
6.ENV
格式为ENV <key> <value>
指定环境变量
7.ADD
格式ADD <src> <dest>
该命令将复制指定的<src>到容器的<dest>.其中<src>可以是Dockerfile所在目录的一个相对路径(文件和目录);也可以是URL。
8.COPY
格式为COPY <src> <dest>
复制本地主机的<src>至 容器<dest>,目标路径不存在时会自动创建。当使用本地目录为源目录时,推荐使用COPY。
9.ENTRYPOINT
container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条
ENTRYPOINT没有CMD的可替换特性。
10.VOLUME
可以将本地文件夹或者其他container的文件夹挂载到container中。
VOLUME ["/data1","/data2"]
11.USER
格式为USER daemon
指定运行容器时的用户名或UID,后续的RUN也会使用指定用户。
12.WORKDIR
格式为WORKDIR /path/to/workdir
切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效
WORKDIR /a
WORKDIR b
WORKDIR c
最终:/a/b/c
13.ONBUILD
格式为ONBUILD [ INSTRUCTION]
ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行.当创建的镜像作为基础镜像时所执行的操作指令。
创建镜像
docker build[选项] 路径
指定dockerfile所在路径为/tmp/docker_buider/ ,并且希望 生成镜像标签为build_repo/first_image :
$sudo docker build -t build_repo/first_image /tmp/docker_builder/
e.g. Dockerfile
FROM shc-harbor-dev.hpeswlab.net/itsma/itom-itsma-opensuse-base:2017.04.26
# set proxy
ENV http_proxy @{http.proxy}
#install wget
RUN zypper --non-interactive install wget tar
&& zypper clean
# install Nodejs 6.91
RUN wget http://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.gz -P /app
&& tar -vzxf /app/node-v6.9.1-linux-x64.tar.gz -C /app
&& rm -rf /app/node-v6.9.1-linux-x64.tar.gz
#set node environment
ENV NODE_HOME /app/node-v6.9.1-linux-x64/bin
ENV PATH $NODE_HOME:$PATH
ENV http_proxy ""
RUN mkdir -p /pv/itsma/conf /app/yaml_output /app/config-service/yamls /itsma-certificate/upload /itsma-certificate/bundle
COPY configure-ui.tar.gz /app/
#COPY smarta-admin-ui.tar.gz /app/
COPY configure-backend.jar /app/config-service/configure-backend.jar
#COPY /var/vols/itom/core/suite-install/itsma/services/sm/*.yaml /app/config-service/yamls/
COPY configmap_property.json /app/yaml_output
COPY sm-post-pod.yaml /app/config-service/yamls/
COPY run.sh /app
COPY ssl.sh /app
RUN tar -C /app -xzf /app/configure-ui.tar.gz
&& rm -rf /app/configure-ui.tar.gz
&& chmod 500 /app/run.sh
&& chmod 755 /app/ssl.sh
# copy smart admin page
#RUN cp /app/smarta-admin-ui/* /app/configure-ui/dist/
# for security
RUN groupadd itsma_config -g 1999
&& useradd itsma_config -u 1999 -g 1999
&& chown -R itsma_config:itsma_config /app
&& echo "root:bmVlZGNoYW5nZWQ=" | chpasswd
&& echo "itsma_config ALL=NOPASSWD: /usr/bin/ln" >> /etc/sudoers
EXPOSE 8080
WORKDIR /app
USER itsma_config
CMD ["/app/run.sh"]