一、docker简介
1、Docker优势
(1)、启动速度快,秒级实现
(2)、资源利用率高,一台机器可以跑上千个docker容器
(3)、更快的交付和部署,一次创建也配置后,可以再任意地方运行
(4)、内核级别的虚拟化,不需要额外的hypervisor支持。会有更高的性能和效率
(5)、易迁移,平台依赖性不强
2、核心概念
镜像 是一个只读的模板,类似于安装系统用的ISO文件,通过镜像来完成各种应用的部署
容器 镜像类似于操作系统,而容器类似于虚拟机本身,可以启动、开始、停止、删除等操作,每个容器都是相互隔离的
仓库 存放镜像的,分为公开仓库 和 私有仓库。
3、常用操作
docker run -t -i centos /bin/bash
-i:标准输入打开
-t: 分配一个为终端.
-d:在后台运行
docker ps -a
docker rmi centos //镜像名字 可以加 tag
docker tag centos centos:123456
docker ps
docker start 启动上一步操作的 容器。。。启动时支持简写
docker exec -it e4 /bin/bash exec连接容器
docke commit -m "install http" -a "Mint" ID mintt/centos 最后是新镜像名字 -m “内容” -a "author" ID 可以简写
下载镜像,导入镜像
wget https://download.openvz.org/template/precreated/centos-7-x86_64.tar.gz
cat centos-7-x86_64.tar.gz |docker import - opencv-mint-7-x86_64 最后镜像名字
把现有的镜像导出为一个文件
docker save -o ubuntu.tar d355ed3537e9
使用文件恢复本地镜像
docker load < ubuntu.tar 或者 docker load --input ubuntu.tar 导入 没有名字以及tag
docker push liqilong/mint
二、docker 容器管理
docker create -it opencv-mint-7-x86_64
docker start ID 启动
docker run -itd opencv-mint-7-x86_64 /bin/bash 直接在后台运行
docker exec -it ID //上步返回的ID 或者 docker attach ID 可以进入
使用attach进入退出终端,容器停止
docker run -d centos:latest bash -c "while :; do echo 123; sleep 1 ; done "
bf649246bc0ea95a6fc3ef7a8c213310bd0ced4d9396441586d778261bd4297f
docker logs bf6
docker stop bf6 docker run -itd --name Mint_linux centos:latest bash //指定名字
docker rm ID 删除容器 docker rm -f ID //强制删除
docker run --rm -it centos bash -c "sleep 30" //--rm 可以让容器退出后直接删除,在这里命令执行完容器就会退出,不能和-d一起适用
docker export ID >file.tar //导出容器,迁移以后需要导入
cat file.tar |docker import - mint_centos 生成mint_centos镜像
三、Docker仓库管理
国内registry镜像地址 :https://registry.docker-cn.com
docker 删除所有容器 docker rm $(docker ps -a -q)
删除所有未运行 Docker 容器
docker rm $ (docker ps -a -q)
删除所有未打 tag 的镜像
docker rmi $(docker images -q | awk '/^<none>/ { print $3 }')
删除所有镜像
docker rmi $(docker images -q)
根据格式删除所有镜像
docker rm $(docker ps -qf status=exited)
registry私库IP:192.168.1.87
client IP: 192.168.1.88
docker pull registry //registry docker官方提供的一个镜像,使用它来创建本地的docker私有仓库
docker run -d -p 5000:5000 registy //以registry镜像启动容器,监听5000端口
docker exec -it ID /bin/sh
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/mint.com.key -x509 -days 365 -out certs/mint.com.crt
scp -r mint.com.crt root@192.168.1.88:/etc/pki/ca-trust/source/anchors/mint.com.crt
update-ca-trust
docker run -d -p 5000:5000 --restart=always --name registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/mint.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/mint.com.key registry:2
--restart 标志会检查容器的退出代码,并据此来决定是否要重启容器,默认是不会重启。 --restart的参数说明 always:无论容器的退出代码是什么,Docker都会自动重启该容器。 on-failure:只有当容器的退出代码为非0值的时候才会自动重启。另外,该参数还接受一个可选的重启次数参数,`--restart=on-fialure:5`表示当容器退出代码为非0值时重启5次
netstat -lnp|grep 5000 //发现监听5000端口 curl https://mint.com:5000/v2/_catalog --insecure //到client执行命令
docker push 192.168.1.87:5000/mint_ubuntu
error:
Get https://192.168.1.87:5000/v2/: x509: cannot validate certificate for 192.168.1.87 because it doesn't contain any IP SANs
这个地方只能使用 域名 不能使用ip地址,按此步骤,只能使用域名push
查看仓库信息:镜像以及对应的版本
curl https://mint.com:5000/v2/_catalog
curl https://mint.com:5000/v2/mint_busybox/tags/list
拉取仓库镜像
docker pull mint.com:5000/mint_busybox
四、docker 数据管理
docker run -itd -v /root/data/:/data1 centos /bin/sh /bin/bash //data本地文件,data1是docker的
docker run -itd --volumes-from. mint_dokcer mint/centos /bin/sh //使用mintc/entos并且使用MInt_docker的镜像
共享容器的目录
1、创建数据容器 、、 -v /root/data/:/data1 直接可以在本地
docker run -itd -v /data/ --name mint_testvol centos bash 注意这里的/data/是容器的 /data/目录,而不是本地的/data/目录
2、其他容器连接
docker run -itd --volumes-from mint_testvol centos bash
docker run -itd --volumes-from mint_testvol --name= web1 centos bash //数据也是来自mint_testvol
数据卷容器备份恢复
备份:
mkdir vol_data_backup //存放位置
docker run -itd --volumes-from mint_testvol -v /root/data/vol_data_backup/:/backup centos bash //挂载目录 以及在容器里 打包 tar /backup/data.tar /data/ 执行以后会在 宿主机的/root/data/vol_data_backup目录下 查看到tar包
恢复:
思路:先建一个数据卷容器,再建一个新的容器并挂载该数据容器,然后再把tar包解压
docker run -itd -v /data/ --name testvol2 centos bash
docker run --volumes-from testvol2 -v /root/data/vol_data_backup/:/backup centos tar xvf /backup/data.tar
五、docker 网络模式
1、host模式 使用docker run时使用--net=host 使用宿主机网络
2、container模式 --net=conrainer:ID或者 name 多个容器使用共同的网络,看到的IP一样
3、none模式 使用 --net=none 不会配置任何网络
4、bridge 模式 默认模式 这种模式会为每一个容器分配一个独立的Network Namespace 类似于vmware的nat网络模式,同一个宿主机上的所有容器会在同一个网段下,相互之间可以通信。
外部访问容器
docke commit -m "install http" -a "Mint" ID mint/centos 最后是新镜像名字 -m “内容” -a "author"
docker run -itd -p 5123:80 centos_with_httpd bash 、、创建新的容器
docker exec -it e14c148 bash 、、进入容器启动httpd服务
可以通过访问宿主机的5123端口访问 容器的 80 端口
docker 容器互联
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
Connect to MySQL from an application in another Docker container
docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
Connect to MySQL from the MySQL command line client
docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
六、dockerfile
1 FROM //指定基于那个镜像
2、MAINTAINER //指定作者信息 mint mint@mint.com
3、RUN //镜像操作指令
格式为 RUN <command> 或者 RUN ["executable","param1","param2"]
RUN yum install httpd RUN ["/bin/bash","-c","echo hello"]
4、CMD //三种格式 只有最后一个生效
5、EXPOSE 指定要映射出去的端口 启动容器时 -P 自动分配 -p指定端口
6、ENV ENV <key> <value>
ENV MYSQL_VERSION 5.6
7、ADD 格式 ADD <src> <dest> 将本地的一个文件或目录到容器的某个目录里。其中src为Dockerfile所在目录的相对路径 ,也可以是一个url。
ADD <conf/vhost> </usr/local/nginx/conf>
8、CPOY 跟ADD 一样不支持url
9、ENTRYPOINT 容器启动时要执行的命令,只有一条生效,多写只有最后一个生效,
CMD 会被docker run指令覆盖(docker run 时最后的bash 会覆盖dockerfile的CMD),而ENTRYPOINT 不能被覆盖,并且比CMD或者docker run 指定的命令靠前执行
10、VOLUME 格式 VOLUME ["/data"]
创建一个可以从本地主机或其它容器挂载的挂载点
11 USER 格式 USER daemon
指定容器运行的用户
12、WORKDIR 格式 WORKDIR /path/to/workdir
为后续的RUN、CMD、ENTRYPOINT 指定工作目录
The <dest> is an absolute path, or a path relative to WORKDIR, into which the source will be copied inside the destination container.
dockfile创建镜像----nginx
cat dockerfile
#Based on Centos
#Date :2017 07 18
#Auth :mint
FROM centos
MAINTAINER mint liqilong2010@hotmail.com
# install necessary tools
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
#install Nginx
#ADD http://nginx.org/download/nginx-1.12.1.tar.gz .
#第一次使用ADD报错 路径有问题,问题解决了,ADD 拉取的是解压好的包,直接进入编译就行不需要解压
RUN wget http://nginx.org/download/nginx-1.12.1.tar.gz
RUN tar zxvf nginx-1.12.1.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.12.1 && ./configure --prefix=/usr/local/nginx && make && make install
#RUN rm -rf /usr/local/nginx/conf/nginx.conf
#COPY .nginx_conf /usr/local/nginx/conf/nginx.conf
EXPOSE 80
#CMD /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#执行以后容器停止
docker build -t centos_nginx . //-t 生成镜像的名字 . dockerfile 文件位置
docker run --itd --name centos_nginx -P centos_nginx bash
转载于:https://blog.51cto.com/liqilong2010/1948837