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
posted @ 2021-12-29 10:22  IT终结者  阅读(29)  评论(0编辑  收藏  举报