docker基础
标题:docker的基础知识讲解
标签:V1
发布时间:2021-11-24
负责人:徐梓宁
Docker的安装
CenterOS7安装
有网络
#卸载老版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#设置仓库
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#安装docker
$ sudo yum install docker-ce docker-ce-cli containerd.io
#运行docker
$ sudo systemctl start docker
#设置阿里镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://50ym8btj.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#设置开机自启动
systemctl enable docker
无网络
1、下载静态二进制存档。转到 https://download.docker.com/linux/static/stable/
2、将下载好的文件上传到服务器
3、解压文件
tar xzvf docker-19.03.5.tgz
4、将二进制文件移到可执行路径上的目录,例如/usr/bin/
sudo cp docker/* /usr/bin/
5、配置 docker.service文件
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
6、启动dockerd服务进程
systemctl daemon-reload
systemctl start docker.service
7、查看docker 安装信息
docker info
8、开机自动启动
sudo systemctl enable docker
yum无网络安装
1、在和宿主机一样的环境下连接网络下载yum依赖包
yum install --downloadonly --downloaddir=/tmp/docker docker-ce docker-ce-cli containerd.io
2、把下载的依赖包复制到目标服务器进行安装
rpm -Uvh *.rpm
rpm -Uvh *.rpm --nodeps --force
Docker命令
基础命令
docker version
docker info
docker --help
镜像命令
docker images 列出本地主机上的镜像
-a :列出本地所有的镜像(含中间映像层)
-q :只显示镜像ID。
--digests :显示镜像的摘要信息
--no-trunc :显示完整的镜像信息
docker search docker search [OPTIONS] 镜像名字
--no-trunc : 显示完整的镜像描述
-s : 列出收藏数不小于指定值的镜像。
--automated : 只列出 automated build类型的镜像
docker pull 下载镜像 eg:docker pull 镜像名字[:TAG]
docker rmi 删除某个XXX镜像名字ID
删除单个 docker rmi -f 镜像ID
删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部 docker rmi -f $(docker images -qa)
容器命令
- 新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字": 为容器指定一个名称;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort(常用)
containerPort
- 列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
--no-trunc :不截断输出
进入正在运行的容器并以命令行交互
docker exec -it 容器ID /bin/bash
重新进入docker attach 容器ID
上述两个区别
attach 直接进入容器启动命令的终端,不会启动新的进程
exec 是在容器中打开新的终端,并且可以启动新的进程
退出容器
exit 容器停止退出
ctrl+P+Q 容器不停止退出
启动容器
docker start 容器ID或者容器名
重启容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
强制停止容器
docker kill 容器ID或者容器名
删除已停止的容器
删除一个
docker rm 容器ID
一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
启动守护式容器
docker run -d 容器名
查看容器日志
docker logs -f -t --tail 容器ID
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
镜像命令高级
构建镜像
docker build -t xxx/jdk8:1.0.0 .
把镜像保存成tar包
docker save -o haft-jdk8.tar REPOSITORY:tag
把tar包load成镜像
docker load -i xxx.tar
提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
升华命令
//删除所有已XXX开头的镜像
docker images |grep ftoa | awk -F' ' '{print $3}' | xargs docker rmi
//查看所有容器ip
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
//设置容器重启策略
docker update --restart=always mysql
docker网络
实现原理
Docker使用Linux桥接(参考《Linux虚拟网络技术》),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
四类网络模式
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | –net=bridge | (默认为该模式) |
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
Host模式如下图所示:
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
Container模式示意图:
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
None模式示意图:
bridge模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
bridge模式如下图所示:
命令
查看网络
docker network ls
docker network create
docker network rm
docker network inspect
docker network connect
docker network disconnect
docker安装各种容器
安装mysql
docker pull mysql:5.7
docker run --privileged=true -p 3306:3306 --name mysql -v /haft/mysql/conf:/etc/mysql/conf.d -v /haft/mysql/logs:/logs -v /haft/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --lower_case_table_names=1
docker update --restart=always mysql
安装redis
docker pull redis:5.0.7
docker run -p 6379:6379 --name=redis -v /haft/redis/data:/data -v /haft/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:5.0.7 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
docker update --restart=always redis
安装rabbitmq
docker pull rabbitmq:3.8.1-management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v /haft/rabbitmq/data:/var/lib/rabbitmq --hostname myRabbitmq -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3.8.1-management
docker update --restart=always rabbitmq
安装fastdfs
docker pull season/fastdfs:1.2
docker run -ti -d --name tracker -v /haft/fastdfs/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs:1.2 tracker
docker run -ti -d --name storage -v /haft/fastdfs/storage_data:/fastdfs/storage/data -v /haft/fastdfs/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.100.210:22122 season/fastdfs:1.2 storage
//当TRACKER_SERVER不起作用,自己编辑conf复制到storage中
docker cp /haft/storage.conf storage:/fdfs_conf
docker update --restart=always tracker
docker update --restart=always storage
安装elasticsearch
docker pull elasticsearch:6.8.8
docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" --net host -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 elasticsearch:6.8.8
docker update --restart=always elasticsearch
安装gitlab
docker pull gitlab/gitlab-ce
mkdir -p /xzn/gitlab/config
mkdir -p /xzn/gitlab/logs
mkdir -p /xzn/gitlab/data
docker run -d --hostname gitlab.example.com -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /xzn/gitlab/config/:/etc/gitlab -v /xzn/gitlab/logs/:/var/log/gitlab -v /xzn/gitlab/data/:/var/opt/gitlab --privileged=true gitlab/gitlab-ce
安装MinIO
docker pull minio/minio
docker run -p 9000:9000 --name minio \
-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server /data
安装nginx
docker run -d -p 80:80 -p 443:443 --name docker_nginx \
-v /haft/nginx/www:/usr/share/nginx/html \
-v /haft/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /haft/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /haft/nginx/logs:/var/log/nginx nginx:1.16.1
//把SSL文件复制到nginx
docker cp /haft/cert docker_nginx:/etc/nginx/
安装tomcat
docker run -d -p 8080:8080 --name tomcat \
-v /haft/tomcat/webapps:/usr/local/tomcat/webapps \
-v /haft/tomcat/conf:/usr/local/tomcat/conf \
--restart=always tomcat:8.5.51-jdk8-openjdk