docker笔记

实验基于Ubuntu 16.04下的docker

  1. 安装docker:apt-get install docker,启动docker服务:sudo service docker start

  2. 如果启动了docker,但是执行其他命令时遇到“Cannot connect to the Docker daemon. Is the docker daemon running on this host”,可能是因为没有使用sudo。

  3. 入门命令

     ##########################################
     # hello,world
     ##########
     # hello,world
     docker run ubuntu:15.10 /bin/echo "Hello world"
     
     # 交互式命令
     # -t:在新容器内指定一个伪终端或终端。
     # -i:允许你对容器内的标准输入 (STDIN) 进行交互。
     docker run -i -t ubuntu:15.10 /bin/bash
     
     # 后台模式启动容器
     docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
     
     # 查看正在运行的容器
     docker ps
     
     # 查看容器输出的日志
     docker logs d345a    
     
     # 停止容器
     docker stop d345a
     
     ##########################################
     # 容器
     ##########
     # 查看docker命令帮助
     docker stats --help
     
     # 运行一个web应用
     # -d 后台运行
     # -P 将容器内部的网络端口映射到主机上,默认5000:32769
     docker run -d -P training/webapp python app.py
     # 容器内部的5000映射到本地host的5000
     docker run -d -P 5000:5000 training/webapp python app.py
     
     # 查看端口映射
     docker port 7a38a1
     
     # 使用类似tail -f将容器内部的标准输出
     docker logs -f a7893d
    
     # 查看容器内部运行的进程
     docker top 7a38b2
    
     # 查看docker容器的状态和内部信息
     docker inspect 7a234b1
    
     # 停止、启动、移除容器(移除容器时,容器必须是停止的)
     docker stop/start/rm 78da2b
     
     ##########################################
     # 镜像
     ##########
     # 列出镜像
     docker images
     
     # 获取新的镜像
     docker pull ubuntu:13.10
     
     # 搜索镜像,https://hub.docker.com/
     docker search httpd
     # OFFICAL:是否为官方
     
     # 更新镜像
     docker run -t -i centos /bin/bash
     # 进入bash后执行yum update,等待更新完成
     # 更改完成后,进行版本的提交
     docker commit -m="has update" -a="作者" e23bi33a myname/centos:v2
    
     # 构建镜像,编写Dockerfile
     runoob@runoob:~$ cat Dockerfile 
     FROM    centos:6.7
     MAINTAINER      Fisher "fisher@sudops.com"
     
     RUN     /bin/echo 'root:123456' |chpasswd
     RUN     useradd runoob
     RUN     /bin/echo 'runoob:123456' |chpasswd
     RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
     EXPOSE  22
     EXPOSE  80
     CMD     /usr/sbin/sshd -D
     
     每一个指令都会在镜像上创建一个新的层,每一个指定的前缀必须大写
     FROM指令使用那个镜像源
     RUN指令告诉docker在镜像内执行指令
     
     # 构建
     docker build -t myname/mycentos67 .
     # -t 指定目标镜像名
     # . Dockerfile文件所在目录
     
     # 打tag
     docker tag 78ai38a myname/mycentos67:dev
    
     ##########################################
     # 容器连接
     ##########
     docker run -d -P centos /bin/echo "hello"
     docker run -d -p 5000:5000 centos /bin/echo "hello"
     # -P :是容器内部端口随机映射到主机的高端口
     # -p : 是容器内部端口绑定到指定的主机端口
    
     docker run -d -p 127.0.0.1:5001:5002 centos /bin/echo "hello"
     # 这样我们就可以通过访问127.0.0.1:5001来访问容器的5002端口
    
     docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
     # UDP端口映射
    
     # docker port h43e34
     
     # 命名
     docker run -d -P --name runoob training/webapp
    
  4. tomcat映射端口时报错:iptables failed: iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8889 -j DNAT --to-destination

     # pkill docker
     # 原链接直接杀进程有点暴力,改为调用stop
     service docker stop
     
     # 清空nat的防火墙规则
     # -F, --flush [chain]
     #      Flush the selected chain (all the chains in the table if none is given).  This is  equivalent  to
     #      deleting all the rules one by one.
     iptables -t nat -F
     
     # 关闭docker0网卡
     ifconfig docker0 down
     
     # brctl - ethernet bridge administration
     # The command brctl delbr <name> deletes the instance <name> of the ethernet bridge. 
     # The network interface  corresponding to the bridge must be down before it can be deleted!
     # 删除桥接
     brctl delbr docker0
     
     # 启动docker
     service docker start
    
     # 参考文章: http://www.linuxidc.com/Linux/2015-02/113141.htm
    
  5. 安装elasticsearch 2.4.1

    nshou/elasticsearch-kibana

     docker pull nshou/elasticsearch-kibana:kibana4
     docker run -d -p 9200:9200 -p 5601:5601 -p 9300:9300 --name="ek" nshou/elasticsearch-kibana:kibana4
    

    遇到一个问题,无法使用jar客户端连接es的9300端口,首先排除服务端与客户端版本不一致的问题(可参考这篇),然后需要修改es的配置。
    通过docker -i -t启动进入到bash,修改.yml里的network.publish_host为docker所在主机的外部ip,需要注意这个参数的意义。

     network.bind_host: 192.168.0.1
     设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,绑定这台机器的任何一个ip。
     
     network.publish_host: 192.168.0.1
     设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。
     
     network.host: 192.168.0.1
     这个参数是用来同时设置bind_host和publish_host上面两个参数。
     
     transport.tcp.port: 9300
     设置节点之间交互的tcp端口,默认是9300。
     
     http.port: 9200
     设置对外服务的http端口,默认为9200。
    

    参考

    之后用docker commit生成一个新的版本,然后再启动(-c后的参数是从之前启动的docker inspect里找到的,暂时不知道有什么更好的办法)

     docker run -d -p 9200:9200 -p 5601:5601 -p 9300:9300 my/es:v2 /bin/sh -c 'elasticsearch/bin/elasticsearch --es.logger.level=OFF --network.host=0.0.0.0 & kibana/bin/kibana -Q'
    
  6. mysql

    https://dev.mysql.com/doc/refman/5.7/en/docker-mysql-more-topics.html
    https://hub.docker.com/r/mysql/mysql-server/

    update user set host='%' where user='root';
    flush privileges;
    

    install mysql, and set root pwd, and set character-set

    sudo docker pull mysql:5.6.38    
    sudo docker run --name mysql5638 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.38 --character-set-server=utf8mb4
    
  7. 给运行中的容器添加端口映射

     #方法一:通过设置iptables
     docker inspect 'containerid' | grep IPAddress
     # 将容器的8000端口映射到主机的8001端口
     iptables -t nat -A  DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
    
     #方法二:
     #提交一个运行中的容器为镜像
     docker commit containerid aaa/bbb
     docker run -d -p 8000:80 aaa/bbb /bin/bash
    
  8. 进入正在运行的容器(1.3.X版本之后)

     sudo docker exec -it 775c7c9ee1e1 /bin/bash
    
  9. 复制文件

    从主机复制到容器```sudo docker cp host_path containerID:container_path```
    从容器复制到主机```sudo docker cp containerID:container_path host_path```
    
  10. rabbitmq
    启动容器后,可以浏览器中访问http://localhost:15672来查看控制台信息
    默认的用户名:guest,密码:guest

       docker pull rabbitmq:management
       docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 rabbitmq:management
    

参考:
docker-hello-world

posted @ 2017-09-22 02:41  liqipeng  阅读(370)  评论(0编辑  收藏  举报