一,dodeck简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
二,docker build
docker build 命令用于使用 Dockerfile 创建镜像。
构建Dockerfile,
#创建新的 java项目 docker镜像
docker build -t springboot:1.0 .
-t springboot: v1.0 给新构建的镜像取名为 springboot, 并设定版本为 v1.0
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD console-1.2.0-RELEASE-20170620.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
关键命令解释
FROM…AS…
这是Docker 17.05及以上版本新出来的指令,其实就是给这个阶段的镜像起个别名:FROM ...(基础镜像) AS ...(别名),在后面引用这个阶段的镜像时直接使用别名就可以了
COPY
COPY . /root/workspace/agent表示将当前文件夹(.表示当前文件夹,即Dockerfile所在文件夹)的所以文件拷贝到容器的/root/workspace/agent文件夹中。通过--from参数也可以从前面阶段的镜像中拷贝文件过来,比如--from=builder表示文件来源不是本地文件系统,而是之前的别名为builder的容器
WORKDIR
在执行RUN后面的shell命令前会先cd进WORKDIR后面的目录
ENTRYPOINT
这个参数表示镜像的“入口”,镜像打包完成之后,使用docker run命令运行这个镜像时,其实就是执行这个ENTRYPOINT后面的可执行文件(一般是一个shell脚本文件),也可以通过["可执行文件", "参数1", "参数2"]这种方式来赋予可执行文件的执行参数,这个“入口”执行的工作目录也是WORKDIR后面的那个目录
ADD
移动并且解压缩
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
#启动刚刚创建的 docker java 项目
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime:ro -e "JAVA_OPTS=-Xmx52m" -p 8081:8081 -d springboot:1.0
三,docker启动,重启,关闭命令
启动 systemctl start docker
守护进程重启 sudo systemctl daemon-reload
重启docker服务 systemctl restart docker
重启docker服务 sudo service docker restart
关闭docker service docker stop
关闭docker systemctl stop docker
#重启
sudo /etc/init.d/docker restart
四,docker命令
常用选项说明
1.示例
-d, --detach=false
, 指定容器运行于前台还是后台,默认为false-i, --interactive=false
, 打开STDIN,用于控制台交互-t, --tty=false
, 分配tty设备,该可以支持终端登录,默认为false-u, --user=""
, 指定容器的用户-a, --attach=[]
, 登录容器(必须是以docker run -d启动的容器)-w, --workdir=""
, 指定容器的工作目录-c, --cpu-shares=0
, 设置容器CPU权重,在CPU共享场景使用-e, --env=[]
, 指定环境变量,容器中可以使用该环境变量-m, --memory=""
, 指定容器的内存上限-P, --publish-all=false
, 指定容器暴露的端口-p, --publish=[]
, 指定容器暴露的端口-h, --hostname=""
, 指定容器的主机名-v, --volume=[]
, 给容器挂载存储卷,挂载到容器的某个目录--volumes-from=[]
, 给容器挂载其他容器上的卷,挂载到容器的某个目录--cap-add=[]
, 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities--cap-drop=[]
, 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities--cidfile=""
, 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法--cpuset=""
, 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU--device=[]
, 添加主机设备给容器,相当于设备直通--dns=[]
, 指定容器的dns服务器--dns-search=[]
, 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件--entrypoint=""
, 覆盖image的入口点--env-file=[]
, 指定环境变量文件,文件格式为每行一个环境变量--expose=[]
, 指定容器暴露的端口,即修改镜像的暴露端口--link=[]
, 指定容器间的关联,使用其他容器的IP、env等信息--lxc-conf=[]
, 指定容器的配置文件,只有在指定--exec-driver=lxc时使用--name=""
, 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字--net="bridge"
, 容器网络设置:- bridge 使用docker daemon指定的网桥
- host //容器使用主机的网络
- container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
- none 容器使用自己的网络(类似--net=bridge),但是不进行配置
--privileged=false
, 指定容器是否为特权容器,特权容器拥有所有的capabilities--restart="no"
, 指定容器停止后的重启策略:- no:容器退出时不重启
- on-failure:容器故障退出(返回值非零)时重启
- always:容器退出时总是重启
--rm=false
, 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)--sig-proxy=true
, 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理
#查看当前版本
docker version
#列出本地镜像
docker images
#删掉镜像
docker rmi id
#显示所有的容器,包括未运行的
docker ps -a
#强制删除容器
docker rm -f id
#查找所有镜像名包含memcached ,并且收藏数大于0的镜像
docker search --filter=stars=0 memcached
--no-trunc :显示完整的镜像描述;
#查看详细信息
docker inspect dcd4ffa30477
#安装指定版本
docker pull python:3.5
#docker文件复制到宿主机
docker cp kafka:/opt/kafka/config /home/fosun/server/kafuka
#docker 查看日志
docker logs -f --tail=100 tomcat
#docker 查看环境参数
docker exec container env
2.文件拷贝
#复制/server/odoo.conf到odoo容器内的/etc/odoo/路径下
docker cp /server/odoo.conf odoo:/etc/odoo/
3.docker link
--link <name or id>:alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
docker run -d --name node --link selenium_hub:hub selenium/node-chrome-debug
selenium_hub是上面启动的容器的名字,这里作为源容器,hub是该容器在link下的别名(alias),通俗易懂的讲,站在node容器的角度,selenium_hub和hub都是容器的名字,并且作为容器的hostname,node用这2个名字中的哪一个都可以访问到容器并与之通信(docker通过DNS自动解析)。以下两点需要注意下:
- link是单向的,以上例子里node容器可以访问selenium_hub,反向则不能
- link后,访问的端口是selenium_hub内的端口,不是对外的端口
4.查询要安装的详细版本
docker search centos:6.5
5.删除不使用docker容器
#删除docker中未运行的容器
fi=`docker ps -a -q`
runid=`docker ps -q`
for id in $fi
do
#if [ "$id" != "a5c77966d580" ];then
#docker rm $id
#fi
for rid in $runid
do
if [ "$id" != "$rid" ];then
docker rm $id
fi
done
done
fi 为所有的容器进程id
runid 为启动的进程id
[ "$id" != "$rid" ] 注意空格
五,docker 用法实例
1.docker 安装 kafuka
#下载
docker pull docker.io/wurstmeister/kafka
#启动
#!/bin/bash
docker run -d --name kafka --publish 9092:9092 \
--env KAFKA_BROKER_ID=100 \
--env HOST_IP=192.168.1.20 \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.1.30:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.1.20 \
--env KAFKA_ADVERTISED_PORT=9092 \
--restart=always \
--volume /etc/localtime:/etc/localtime \
wurstmeister/kafka
#进入
docker exec -it {id} /bin/bash
kafuka测试
创建主题
kafka-topics.sh --create --zookeeper 192.168.1.30:2181 --replication-factor 1 --partitions 1 --topic mykafka
查看主题
kafka-topics.sh --zookeeper 192.168.1.30:2181 --list
删除Topic
kafka-topics.sh --zookeeper 192.168.1.30:2181 --delete --topic mykafka
运行一个消息生产者,指定topic为刚刚创建的主题
kafka-console-producer.sh --broker-list 192.168.1.20:9092 --topic mykafka
运行一个消费者,指定同样的主题
kafka-console-consumer.sh --bootstrap-server 192.168.1.20:9092 --topic mykafka --from-beginning
2.docker 安装 memcached
docker pull docker.io/memcached
docker run --privileged=true --restart=always --name memcached -m 2048m -d memcached -p 11211:11211
3.docker 安装redis后登陆
docker run --name redis-test -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "your passwd"
-p 6379:6379 :将容器内端口映射到宿主机端口(右边映射到左边)
redis-server –appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
requirepass “your passwd” :设置认证密码
–restart=always : 随docker启动而启动
docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 -a 'password'
127.0.0.1:6379> info
4.docker 安装odoo
docker pull postgres:9.6
docker run -d -v /www/postgres:/usr/lib/postgresql/data -e POSTGRES_USER=odoo -e POSTGRES_PASSWORD=odoo --name db postgres:9.6
5.docker 安装odoo
docker pull odoo:10
docker run -v /www/odoo/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo:10
多个odoo
docker run -p 8010:8069 --name odoo10 --link db:db10 -t odoo:10.0
docker run -p 8011:8069 --name odoo11 --link db:db11 -t odoo:11.0
注意防火墙端口
#需要将9092 对外的端口 公开 app才能使用链接上去
firewall-cmd --zone=public --add-port=9092/tcp
firewall-cmd --permanent --zone=public --add-port=9092/tcp