Docker简单操作(二)
1、docker容器简单操作 docker search 镜像名 #搜索镜像、如docker search nginx docker pull alpine #拉取镜像、alpine是比较小的镜像 docker push 镜像 #上传镜像 docker images #查看本机存在的镜像 docker save nginx >/tmp/nginx.tar.gz #镜像导出 docker load nginx </tmp/nginx.tar.gz #镜像导入 docker run alpine sh #启动镜像alpine docker run -it alpine sh #加上-it、有可运行的终端 ctrl不放手按p跟q键盘退出、如果直接退出容器也就退出了 docker ps #显示运行的容器 docker ps -a #显示所有容器、不管运行还是没有运行的 docker rm -f a85e6f7b48ba #删除正在运行的容器加-f、对应容器ID docker system df #查看镜像、容器、数据卷所占用的空间。 docker run -it --name mynginx nginx #启动nginx容器、--name是命名 docker inspect mynginx #查看容器的详细信息、IP、网关等 docker exec -it mynginx sh #-i 让docker的标准输入打开{input},-t 让docker分配一个伪终端 #查看容器运行产生的信息 docker logs docker logs ‐f #容器的启动、停止stop 以及kill docker start 容器名称或者ID docker stop 容器名称或者ID docker kill 容器名称或者ID #如何杀死所有正在运行的容器 docker kill $(docker ps ‐a ‐q) #删除镜像 [root@linux-node1 ~]# docker rmi 镜像ID #指定镜像ID #镜像id如果指向了两个repository,用上面命令是无法删除的 例如: [root@linux-node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE w787815/my_nginx v1 99805914d177 35 hours ago 109 MB docker.io/w787815/my_nginx latest 99805914d177 35 hours ago 109 MB #提示 [root@linux-node1 ~]# docker rmi 99805914d177 Error response from daemon: conflict: unable to delete 99805914d177 (must be forced) - image is referenced in multiple repositories [root@linux-node1 ~]# docker rmi w787815/my_nginx:v1 #指定名称去删除 2.docker网络访问 #2.1 容器端口映射 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过P或 者p参数来指定容器端口映射。当使用P(大写)时,docker会随机映射一个端口到容器内部开放的端口 [root@linux-node1 ~]# docker run --name mynginx -d -p 80:80 w787815/mynginx nginx #--name指定容器名称、-d后台运行 ffebe563ea32c21272f036a45a9d125970f2b131ce0ca560828337f1ee331622 [root@linux-node1 ~]# [root@linux-node1 ~]# [root@linux-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ffebe563ea32 w787815/mynginx "nginx" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp mynginx 0be494e9e192 centos "bash" 37 hours ago Up 37 hours serene_davinci docker run –rm it P nginx #端口随机映射 docker run –rm it p 80:80 nginx #映射所有地址,当然p 也可以绑定多个端口 docker run it –rm p 80:80 p 8080:80 nginx docker run –rm it p 127.0.0.1:80:80 nginx #指定地址的指定端口 docker run –rm it p 127.0.0.1:80:80/udp nginx #默认是tcp映射但是也可以指定UDP docker run –rm it p 127.0.0.1::80 nginx #此时默认会绑定宿主机上所有ip的80端口 2.2容器互联 容器间互联是让多个容器中应用进行交互的一种方式。 如果你之前有 Docker 使用经验,你可能已经习惯了使用 --link 参数来使容器互联。 随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。 容器间互联是通过name来进行指定,因此起一个容易记忆的容器名是多么的重要 2.2.1使用 --link 参数来使容器互联。 [root@linux-node1 ~]# docker run --name web1 -d -p 80:80 w787815/mynginx nginx 71004dc88f03a237e7700badaad45852a04d993140a76a689072fd528532f007 [root@linux-node1 ~]# docker run --name web2 --link web1 -d -p 8080:80 w787815/mynginx nginx [root@linux-node1 ~]# docker exec -it web2 sh sh-4.2# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.6 web1 71004dc88f03 172.17.0.7 267847dcf484 2.2.2新建网络 下面先创建一个新的 Docker 网络。 [root@linux-node1 ~]# docker network create -d bridge my-net #-d 参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode, 连接容器 运行一个容器并连接到新建的 my-net 网络 [root@linux-node1 ~]# docker run --name nginx1 --network my-net -d -p 8088:80 w787815/mynginx nginx 打开新的终端,再运行一个容器并加入到 my-net 网络 [root@linux-node1 ~]# docker run --name nginx2 --network my-net -d -p 8188:80 w787815/mynginx nginx 再打开一个新的终端查看容器信息 [root@linux-node1 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae4de271badb w787815/mynginx "nginx" 18 seconds ago Up 18 seconds 0.0.0.0:8188->80/tcp nginx2 370f4481322c w787815/mynginx "nginx" 47 seconds ago Up 46 seconds 0.0.0.0:8088->80/tcp nginx1 #查看IP 并用ping来测试 [root@linux-node1 ~]# docker exec -it nginx2 sh sh-4.2# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 ae4de271badb sh-4.2# exit exit [root@linux-node1 ~]# docker exec -it nginx1 sh sh-4.2# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 370f4481322c sh-4.2# ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.056 ms 如果你有多个容器之间需要互相连接,推荐使用 Docker Compose。 3、配置DNS dns服务 默认docker是采用宿主机的dns 可以采用‐‐dns=xxxx的方式制定 vim /usr/lib/systemd/system/docker.service 也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。 { "dns" : [ "114.114.114.114", "8.8.8.8" ] } 这样每次启动的容器 DNS 自动配置为 114.114.114.114 和 8.8.8.8。使用以下命令来证明其已经生效。 [root@linux-node1 ~]# sudo systemctl daemon-reload [root@linux-node1 ~]# sudo systemctl restart docker #修改配置文件需重启 [root@linux-node1 ~]# docker run -it --rm centos cat etc/resolv.conf search example.com nameserver 114.114.114.114 nameserver 8.8.8.8 如果用户想要手动指定容器的配置,可以在使用 docker run 命令启动容器时加入如下参数: -h HOSTNAME 或者 --hostname=HOSTNAME 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到。 --dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。 --dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。 注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。