Docker ip:172.16.3.17 Docker 配置清华大学的docker镜像源 以下内容根据 官方文档 修改而来。 如果原来安装过docker-ce需要先移除 yum remove docker docker-common docker-selinux docker-engine 安装一些依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 根据你的发行版下载repo文件: wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 把软件仓库地址替换为清华大学国内的镜像源: sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo 利yum安装docker yum makecache fast yum install docker-ce 启动docker systemctl start docker.service 设置为开机自启动 systemctl enable docker.service 查看docker版本 docker version 返回结果: Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:27:04 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:25:42 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683 查看docker系统信息 docker info 返回结果 Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.8 Storage Driver: overlay2 Backing Filesystem: <unknown> Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 8 Total Memory: 7.795GiB Name: localhost.localdomain ID: Q2PR:QCIS:GBPN:YFIT:OX4I:57DH:4GT2:JYKL:E7F6:MBO2:FPRU:D3HC Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 编辑docker的配置文件,启用国内的加速借点 vim /etc/docker/daemon.json { "registry-mirrors": ["https://e9yneuy4.mirror.aliyuncs.com"] } 修改好以后,重启docker systemctl restart docker.service docker容器常用命令 搜索nginx容器镜像 docker search nginx 解释: docker search 搜索docker容器镜像后面加上容器的名称即可 下载一个nginx容器镜像,默认下载它会下载最新的镜像 docker pull nginx 再来下载一个alpine镜像,最轻量的linux发行版 docker pull alpine 返回结果: Using default tag: latest latest: Pulling from library/alpine cbdbe7a5bc2a: Pull complete Digest: sha256:9a839e63dad54c3a6d1834e29692c8492d93f90c59c978c1ed79109ea4fb9a54 Status: Downloaded newer image for alpine:latest docker.io/library/alpine:latest 下载非官方的docker容器镜像,下载一个163的tomcat docker pull hub.c.163.com/library/tomcat:latest 查看当前都有哪些docker容器 docker image ls 返回结果 REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6a266 2 weeks ago 5.61MB nginx latest 602e111c06b6 2 weeks ago 127MB hub.c.163.com/library/tomcat latest 72d2be374029 2 years ago 292MB 删除一个镜像,可以后面跟名字或者跟ID都可以 docker image rm hub.c.163.com/library/tomcat 导出一个现有的alpine容器镜像,并且打成一个docker_alpine.tar.gz包,把镜像存到/opt/目录下 docker image save -o /opt/docker_alpine.tar.gz alpine:latest 或者 docker image save alpine:latest > docker_alpine.tar.gz 解释: docker image save 导出镜像命令 -o 导出到指定的路径下 删除现有的alpine镜像,并再把刚才导出的镜像,导入进来 先删除 docker image rm alpine:latest 再倒入现有的alpine docker image load -i /opt/docker_alpine.tar.gz 解释: docker image load 导入镜像命令 -i 指定导入镜像存放的位置 再来查看现有的镜像 docker image ls 返回结果 REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6a266 2 weeks ago 5.61MB nginx latest 602e111c06b6 2 weeks ago 127MB 容器常用操作 运行一个nginx的docker容器,如果本地没有这个镜像它会去网上下载这个镜像 docker run -d -p 80:80 nginx 返回结果: 解释: docker run 启动容器 -d 后台运行 -p 端口映射,指定docker容器内部端口和宿主机的外部端口 80:80 外部端口和内部端口 nginx 容器名称 启动好以后,可以用浏览打开172.16.3.17,访问一下,可以看到nginx的默认界面 http://172.16.3.17/ 下载一个centos6.9的容器镜像 docker pull centos:6.9 启动centos:6.9并分配一个虚拟终端 [root@localhost ~]# docker run -it centos:6.9 返回结果 [root@52127dea4de7 /]#现在看到这个主机名已经变了 这个时候已经进入到容器内部里,这里所执行的操作都是在centos:6.9中执行的 解释: -it 给docker容器镜像,分配一个虚拟终端,就跟xshell连接你的服务器的原理是一样的 退出容器内部 [root@52127dea4de7 /]# exit 返回结果 exi 查看运行中的容器 [root@localhost ~]# docker container ls 容器运行ID 启动容器的名字 容器初始命令 容器的创建时间 容器的状态 端口映射 名气的名字 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f0a6aee72bf1 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp frosty_sammet 指定centos:6.9的名称,也就是不用系统自带的随机名称 docker run --name centos6 -d centos:6.9 解释 --name centos6 指定容器镜像的名称 查看所有的容器,包括运行的和死掉的 [root@localhost ~]# docker ps ls -a 返回结果 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ff49ea8deb centos:6.9 "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago centos6 52127dea4de7 centos:6.9 "/bin/bash" 21 minutes ago Exited (127) 14 minutes ago inspiring_easley f0a6aee72bf1 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp frosty_sammet d7ae00b3ce74 nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 3 hours ago inspiring_matsumot 这里可以看到centos6 查看容器列表 docker ps -a 只显示最近一次运行的一个容器 [root@localhost ~]# docker ps -a -l 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ff49ea8deb centos:6.9 "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago centos6 这里我们可以看到,我们手动指定的名称centos6,这样方便后期管理我们的容器 查看运行中的容器 docker ps 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f0a6aee72bf1 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp frosty_sammet 停掉nginx的容器 [root@localhost ~]# docker container stop f0a6aee72bf1 这是容器的ID f0a6aee72bf1 启动刚才停止的容器 [root@localhost ~]# docker container start f0a6aee72bf1 f0a6aee72bf1 启动一个容器,并进入容器中 后台启动nginx并指定centos6.9的名称 docker run --name nginx -itd -p 81:81 nginx:latest 进入nginx容器内部,并指定sh docker exec -it nginx /bin/sh 解释: docker exec -it 给容器分配一个虚拟终端 nginx 容器的ID或者名称都可以 /bin/sh 指定容器的sh,方便容器内运行命令 给宿主机配置多个IP地址,这样可以让多个docker都能用80,外部访问无需单独加端口 配置临时IP ifconfig eth0:1 172.16.30.223/24 up ifconfig eth0:2 172.16.30.225/24 up ifconfig eth0:3 172.16.30.227/24 up 多个容器实现同时使用80端口 docker run -itd -p 172.16.30.223:80:80 nginx:latest docker run -itd -p 172.16.30.225:80:80 nginx:latest docker run -itd -p 172.16.30.227:80:80 nginx:latest 实现容器172.16.30.223随机端口启动 dicker run -itd -p 172.16.30.223::80 nginx:latest dicker run -itd -p 172.16.30.223::80 nginx:latest 查看随机的端口是多少 netstat -lntup 返回结果 tcp 0 0 172.16.30.225:80 0.0.0.0:* LISTEN 31375/docker-proxy tcp 0 0 172.16.30.223:80 0.0.0.0:* LISTEN 31253/docker-proxy tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5902/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5997/master tcp 0 0 172.16.30.223:32768 0.0.0.0:* LISTEN 32309/docker-proxy tcp 0 0 172.16.30.223:32769 0.0.0.0:* LISTEN 32419/docker-proxy tcp6 0 0 :::22 :::* LISTEN 5902/sshd tcp6 0 0 ::1:25 :::* LISTEN 5997/master udp 0 0 127.0.0.1:323 0.0.0.0:* 5560/chronyd udp6 0 0 ::1:323 :::* 5560/chronyd 这里我们可以看到,开始端口是32768,结束的端口60999 tcp 0 0 172.16.30.223:32768 0.0.0.0:* LISTEN 32309/docker-proxy tcp 0 0 172.16.30.223:32769 0.0.0.0:* LISTEN 32419/docker-proxy 默认docker映射的端口是TCP是协议,如果使用UDP需要加上:udp docker run -itd -p 53:53/udp ntpd:latest 如果我们容器中要指定多个端口可以用多个-p docker run -itd -p 80:80 -p 443:443 nginx:latest 使用-P(大P)随机端口 docker run -itd -P nginx:latest Docker数据卷 把宿主机的某个文件夹下载的文件拷贝到容器中去,首先先来启动一台nginx容器 启动一套虚拟机 docker run -itd -p 80:80 nginx:latest 准备一个html的小网站,自己生成一个就行了 echo "text web server" > /opt/index.html 把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下 先来查看容器的ID docker ps -a 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0102dd74e458 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp sad_rhodes 把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下 docker container cp /opt/index.html 0102dd74e458:/usr/share/nginx/html 用宿主机curl一下 curl 172.16.30.220 返回结果 text web server 映射一个宿主机的本地的目录到容器中,这样直接修改本地的数据文件,就可以直接修改容器中的数据库文件,不需要单独进入容器中去修改 先来创建一个目录 mkdir -p /data 关闭所有允许中的容器 docker rm -f `docker ps -a -q` 映射/data/到容器的/usr/share/nginx/html docker run -itd -p 80:80 -v /data:/usr/share/nginx/html nginx:latest -v 映射卷,映射磁盘目录 docker卷命令 docker volume create inspect 查看卷详细信息 ls prune rm docker映射一个text卷到容器中,如果系统中没有这个卷系统会自动创建 两个docker容器可以同时挂载一个卷,这样两个容器的内容就一模一样了 如果卷里面有东西会把,卷里面的内容映射到容器中去 如果卷里面没有东西会把容器中的内容放到卷里面 docker run -itd -p 80:80 -v text:/usr/share/nginx/html/ nginx:latest -v 卷名:容器目录 查看卷的详细信息 docker volume inspect test 返回结果 [ { "CreatedAt": "2020-07-31T09:01:57+08:00",创建的时间 "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/text/_data",卷存档的目录,后期修改内容可以直接进入这个目录里做修改就行了 "Name": "text",卷的名称 "Options": null, "Scope": "local" } ] 查看/var/lib/docker/volumes/text/_data目录 ls /var/lib/docker/volumes/text/_data 返回结果 50x.html index.html 可以看到这是默认的nginx访问页面文件 总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯筑),否则这个容器就会处于退出的状态 业务在容器中运行:夯筑,启动服务 比如: docker run -itd centos:latest 或 docker run -d centos:latest tail -f /etc/hosts 基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现text web server 先在本地创建一个目录 mkdir -p /data 生辰默认首页文件 echo "text web server" > /data/index.html 生成nginx配置文件 vim /opt/text.conf server { listen 81; server_name localhost; root /opt/ index index.html index.htm; location / { } } 启动容器映射端口,并映射目录 docker run -d -p 80:80 -p 81:81 -v /opt/text.conf:/etc/nginx/conf.d/text.conf -v /data/:/opt/ nginx:latest 解释: -p 80:80 -p 81:81 容器的80映射到宿主机的80 容器的81映射到宿主机的81 多端口映射 -v /opt/text.conf:/etc/nginx/conf.d./text.conf 把物理机/opt/text.conf映射到容器中/etc/nginx/conf.d./text.conf 这里映射的路径一定写全路径,也要写上文件名,如何后面只写目录会报错,必须要写上文件名 -v /data/:/opt/ 把物理机的/data/目录映射到容器的/opt/目录下 第二中方法 首先先把所有的容器结束掉 docker rm -f `docker ps -a -q` 启动容器 docker run -itd -p 80:80 -p 81:81 -v /data:/opt nginx:latest 进入容器 docker exec -it b2080baa3161 /bin/bash 添加nginx的配置文件 echo "server { listen 81; server_name localhost; root /opt/; index index.html index.htm; location / { } }">/etc/nginx/conf.d/test.conf 重启容器 docker restart b2080baa3161