docker学习笔记

一,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自动解析)。以下两点需要注意下:

  1. link是单向的,以上例子里node容器可以访问selenium_hub,反向则不能
  2. link后,访问的端口是selenium_hub内的端口,不是对外的端口

4.查询要安装的详细版本

docker search centos:6.5

https://hub.docker.com/ 

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值