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