docker笔记
实验基于Ubuntu 16.04下的docker
-
安装docker:apt-get install docker,启动docker服务:sudo service docker start
-
如果启动了docker,但是执行其他命令时遇到“Cannot connect to the Docker daemon. Is the docker daemon running on this host”,可能是因为没有使用sudo。
-
入门命令
########################################## # 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
-
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
-
安装elasticsearch 2.4.1
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'
-
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
-
给运行中的容器添加端口映射
#方法一:通过设置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
-
进入正在运行的容器(1.3.X版本之后)
sudo docker exec -it 775c7c9ee1e1 /bin/bash
-
复制文件
从主机复制到容器```sudo docker cp host_path containerID:container_path``` 从容器复制到主机```sudo docker cp containerID:container_path host_path```
-
rabbitmq
启动容器后,可以浏览器中访问http://localhost:15672来查看控制台信息
默认的用户名:guest
,密码:guest
docker pull rabbitmq:management docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 rabbitmq:management