云原生
Kubernetes基础
容器技术介绍
Docker快速入门
Containerd快速入门
K8S主要资源罗列
认识YAML
API资源对象
Kubernetes安全掌控
Kubernetes网络
Kubernetes高级调度
Kubernetes 存储
Kubernetes集群维护
Skywalking全链路监控
ConfigMap&Secret场景应用
Kubernetes基础概念及核心组件
水平自动扩容和缩容HPA
Jenkins
k8s中部署jenkins并利用master-slave模式实现CICD
Jenkins构建过程中常见问题排查与解决
Jenkins部署在k8s集群之外使用动态slave模式
Jenkins基于Helm的应用发布
Jenkins Pipeline语法
EFKStack
EFK日志平台部署管理
海量数据下的EFK架构优化升级
基于Loki的日志收集系统
Ingress
基于Kubernetes的Ingress-Nginx解决方案
Ingress-Nginx高级配置
使用 Ingress-Nginx 进行灰度(金丝雀)发布
Ingress-nginx优化配置
APM
Skywalking全链路监控
基于Helm部署Skywalking
应用接入Skywalking
服务网格
Istio
基于Istio的微服务可观察性
基于Istio的微服务Gateway实战
Kubernetes高可用集群部署
Kuberntes部署MetalLB负载均衡器
Ceph
使用cephadm部署ceph集群
使用Rook部署Ceph存储集群
openstack
glance上传镜像失败
mariadb运行不起来
创建域和项目错误_1
创建域和项目错误_2
安装计算节点
时钟源
网络创建失败
本文档使用 MrDoc 发布
-
+
首页
Docker快速入门
# 1、Docker安装 在Rocky8上,可以先配置对应版本的yum仓库,然后使用yum工具安装Docker - 1)先安装yum-utils工具 ``` yum install -y yum-utils ``` - 2)配置Docker官方的yum仓库 ``` yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ``` - 可以使用国内镜像 ``` yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo ``` - 3)查看Docker版本 ``` yum list docker-ce --showduplicates | sort -r ``` - 4)安装指定版本Docker ``` yum install docker-ce-20.10.9-3.el8 #如果不指定版本,就安装最新版 yum install docker-ce ``` - 5)启动服务 ``` systemctl start docker systemctl enable docker ``` # 2、Docker镜像与容器 Docker镜像拉取下来后,可以直接运行,运行后的东西我们叫做容器,一个镜像可以启动很多容器。 容器就是镜像启动后的状态,在Linux系统里看就是一个进程,但容器是可以进入得,就像进入了一个虚拟机里。 - 1)配置加速器 编写/etc/docker/daemon.json ``` cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"] } EOF ``` 加速链接需要去阿里云官网申请 地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors  - daemon.json参数 ``` { "api-cors-header":"", "authorization-plugins":[], "bip": "", "bridge":"", "cgroup-parent":"", "cluster-store":"", "cluster-store-opts":{}, "cluster-advertise":"", "debug": true, #启用debug的模式,启用后,可以看到很多的启动信息。默认false "default-gateway":"", "default-gateway-v6":"", "default-runtime":"runc", "default-ulimits":{}, "disable-legacy-registry":false, "dns": ["192.168.1.1"], # 设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看。 "dns-opts": [], # 容器 /etc/resolv.conf 文件,其他设置 "dns-search": [], # 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜 索host.example.com 。 注意:如果不设置, Docker 会默认用主机上的 /etc/resolv.conf 来配置容器。 "exec-opts": [], "exec-root":"", "fixed-cidr":"", "fixed-cidr-v6":"", "graph":"/var/lib/docker", #已废弃,使用data-root代替,这个主要看docker的版本 "data-root":"/var/lib/docker", #Docker运行时使用的根路径,根路径下的内容稍后介绍,默认/var/lib/docker "group": "", #Unix套接字的属组,仅指/var/run/docker.sock "hosts": [], #设置容器hosts "icc": false, "insecure-registries": [], #配置docker的私库地址 "ip":"0.0.0.0", "iptables": false, "ipv6": false, "ip-forward": false, #默认true, 启用 net.ipv4.ip_forward ,进入容器后使用 sysctl -a | grepnet.ipv4.ip_forward 查看 "ip-masq":false, "labels":["nodeName=node-121"], # docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121 "live-restore": true, "log-driver":"", "log-level":"", "log-opts": {}, "max-concurrent-downloads":3, "max-concurrent-uploads":5, "mtu": 0, "oom-score-adjust":-500, "pidfile": "", #Docker守护进程的PID文件 "raw-logs": false, "registry-mirrors":["xxxx"], #镜像加速的地址,增加后在 docker info中可查看。 "runtimes": { "runc": { "path": "runc" }, "custom": { "path":"/usr/local/bin/my-runc-replacement", "runtimeArgs": [ "--debug" ] } }, "selinux-enabled": false, #默认 false,启用selinux支持 "storage-driver":"", "storage-opts": [], "swarm-default-advertise-addr":"", "tls": true, #默认 false, 启动TLS认证开关 "tlscacert": "", #默认 ~/.docker/ca.pem,通过CA认证过的的certificate文件路径 "tlscert": "", #默认 ~/.docker/cert.pem ,TLS的certificate文件路径 "tlskey": "", #默认~/.docker/key.pem,TLS的key文件路径 "tlsverify": true, #默认false,使用TLS并做后台进程与客户端通讯的验证 "userland-proxy":false, "userns-remap":"" } ``` 重启docker服务 ``` systemctl restart docker ``` 检查是否生效 ``` docker info |grep -A 3 'Registry Mirrors' ``` - docker info参数 ``` Containers: 45 #容器的数量 Running: 44 #正在运行的数量 Paused: 0 #暂停的数量 Stopped: 1 #已经停止的数量 Images: 264 #镜像数量 Server Version: 1.12.5 #docker server的版本 Storage Driver: devicemapper #存储驱动程序 Pool Name: docker-253:0-537427328-pool #pool name的值根据Data file的模式改变 # direct-lvm 模式(Pool Name 为 docker-thinpool ) Pool Blocksize: 65.54 kB #pool块大小 Base Device Size: 10.74 GB #基本存储大小 Backing Filesystem: xfs #支持的文件系统 Data file: /dev/loop0 #使用的模式为loop-lvm 生产中不推荐使用(loop-lvm性能比较差) 使用 direct-lvm 模式(配置过程在最后面) Metadata file: /dev/loop1 #元数据文件位置 Data Space Used: 86.78 GB #数据使用的空间 direct-lvm 模式 direct-lvm 模式 Data Space Total: 107.4 GB #数据的总空间 Data Space Available: 20.6 GB #数据的可用空间 Metadata Space Used: 159.8 MB #元数据使用的空间 Metadata Space Total: 2.147 GB #元数据的总空间 Metadata Space Available: 1.988 GB #元数据的可用空间 Thin Pool Minimum Free Space: 10.74 GB # Thin pool(瘦供给池)的最小可用空间 *下面有瘦供给的解释 Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file: /var/lib/docker/devicemapper/devicemapper/data #数据loop文件的位置 WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device. #警告信息 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata #元数据loop文件的位置 Library Version: 1.02.135-RHEL7 (2016-09-28) Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: #插件 Volume: local Network: host null bridge overlay Swarm: inactive Runtimes: runc Default Runtime: runc Security Options: seccomp #内核安全组件 Kernel Version: 3.10.0-514.el7.x86_64 #内核版本 Operating System: CentOS Linux 7 (Core) #操作系统 OSType: linux #操作系统类型 Architecture: x86_64 #系统架构 CPUs: 4 #CPU数 Total Memory: 30.96 GiB #总空间 Name: docker-slave3.ctrm #主机名 ID: POZH:PSTG:ULR2:S75Y:OW57:ETGA:Z7RU:WEQA:VGNE:4JMJ:PJ3N:LXZW Docker Root Dir: /var/lib/docker #docker根目录 Debug Mode (client): false #调试模式(client) Debug Mode (server): false #调试模式(server) Registry: https://index.docker.io/v1/ #镜像仓库 Insecure Registries: #非安全镜像仓库 15.116.20.134:5000 15.116.20.104:80 15.116.20.115:80 127.0.0.0/8 ``` - 2)拉取镜像 ``` docker pull busybox ##这个busybox就是系统镜像名字,它是从hub.docker.com去拉取镜像 ``` - 3)查看当前系统镜像 ``` docker image ls 或 docker images ``` - 4)搜索镜像 ``` docker search ubuntu ``` 如果要查询镜像版本,可以访问https://hub.docker.com/,搜索对应的镜像名字,然后点tag进行查看  拉取指定版本镜像 ``` docker pull nginx:1.23.2 ``` - 5)给镜像打标签 ``` docker tag busybox:latest aminglinux:1.2.3 ``` - 6)启动容器 ``` docker run -itd busybox ##把镜像启动为容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,-d表示后台启动,要把-i -t -d 放到镜像名字前面 ``` - 7)查看容器 ``` docker ps -a ##如果不加-a,则不显示已经停止的容器 ``` - 8)停止容器 ``` docker stop de1fb9c8902e ##后面这一串字符串为容器ID,可以通过docker ps查看 可以通过start启动容器 docker start de1fb9c8902e 可以通过restart重启容器 docker restart de1fb9c8902e ``` - 9)删除容器 ``` docker rm de1fb9c8902e ##如果容器未停止,会报错,需要加-f选项 ``` - 10)删除镜像 ``` docker rmi aminglinux:1.2.3 ##这里因为aminglinux:1.2.3为busybox的一个tag,所以此操作只会删除此tag,并不会真正删镜像,如果该镜像没有tag,则直接删除镜像 ``` ``` 也可以直接指定镜像ID docker rmi beae173ccac6 ``` - 11)拉取镜像+启动容器 ``` docker run -itd redis ``` - 12)启动容器时,给容器自定义名字 ``` docker run --name web01 -itd ubuntu ``` - 13)容器运行后直接退出并删除 ``` docker run --rm -it ubuntu bash -c "sleep 30" ``` - 14)进入容器操作 ``` docker exec -it web01 bash ``` 进去后,相当于进入了一个虚拟机一样,安装个nginx ``` apt update apt install -y nginx ``` - 15)将容器重新打包成新镜像 ``` docker commit -m "install nginx" -a "aming" web01 nginx_ubuntu:1.0 ##这里的web01可以改为容器id ``` 再次查看镜像列表,发现多了一个nginx_ubuntu:1.0 - 16)将镜像保存为一个文件 ``` docker save nginx -o nginx.img ``` - 17)将导出的镜像文件导入 ``` docker load --input nginx.img ``` - 18)将容器导出为一个文件 ``` docker export web01 > web01.tar ``` - 19)将导出的文件导入为新的镜像 ``` docker import - ubuntu_test < web01.tar ``` - 20)docker save和docker export的差异 ``` docker save保存的是镜像,docker export保存的是容器 docker save会保留镜像所有的历史记录,docker export不会,即没有commit历史 docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像; docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。 ``` # 3、Docker的数据持久化 - 1)将本地目录映射到容器里 ``` mkdir -p /data/ docker run -tid -v /data/:/data ubuntu bash ## -v 用来指定挂载目录 :前面的/data/为宿主机本地目录 :后面的/data/为容器里的目录,会在容器中自动创建 ``` 可以在/data/里创建一个文件 ``` echo "hello" > /data/1.txt ``` 然后到容器里查看 ``` docker exec -it c82a5a00ae68 bash -c "cat /data/1.txt" ``` - 2)数据卷 创建数据卷 ``` docker volume create testvol ##testvol为数据卷名字 ``` 列出数据卷 ``` docker volume ls ``` 查看数据卷信息 ``` docker volume inspect testvol ``` 使用数据卷 ``` docker run -itd --name aming01 -v testvol:/data/ ubuntu ##和前面直接映射本地目录不同,冒号左边为数据卷名字 ``` 多个容器共享一个数据卷 ``` docker run -itd --name aming02 -v testvol:/data/ ubuntu ``` - 3)将宿主机上的文件快速传输进容器里 ``` docker cp /etc/fstab aming01:/tmp/test.txt docker exec -it aming01 cat /tmp/test.txt ``` # 4、Docker网络 Docker服务启动时会生成一个docker0的网卡,这个网卡是实现容器网络通信的根本。 默认容器使用的网络类型为桥接(bridge)模式,这个桥接和我们的vmware里的桥接可不是一回事。它更像是vmware的NAT模式。 每启动一个容器,都会产生一个虚拟网卡 vethxxx iptables -nvL -t nat ##可以看到DOCKER相关规则,容器之所以可以联网,是靠这些规则实现的 | 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 | (默认为该模式) | 这种模式适用于在单个主机上运行多个容器,容器之间可以通过桥接器进行通信,但与主机和外部网络隔离。在拓扑中,容器通过虚拟网络桥接器连接到主机的网络。 | - 1)host模式 ``` docker run -itd --net=host --name aming03 ubuntu ``` 可以进入容器内,查看hostname,查看ip地址。 这种模式,容器和宿主机共享主机名、IP。 - 2)container模式 该模式下,在启动容器时,需要指定目标容器ID或者name,意思是将要启动的容器使用和目标容器一样的网络,即它们的IP一样 ``` docker run -itd --net=container:/aming01 --name aming04 ubuntu ``` 可以进入容器查看aming01和aming04的网络情况 - 3)none模式 即不需要配置网络 ``` docker run -itd --net=none --name=aming05 ubuntu_test bash ``` 查看: ``` docker exec -it aming05 bash -c "ip add" ``` - 4)bridge模式 也就是默认模式,可以--net=bridge 也可以不指定--net,默认就是bridge - 5)端口映射 ``` docker run -itd -v /data/:/var/www/html/ -p 8088:80 --name aming06 ubuntu_test bash 说明: -p后面跟 宿主机监听端口:容器监听端口 ``` # 5、Dockerfile 是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像。 ## 5.1 Dockerfile格式 1、FROM 指定基于哪个基础镜像,如下: ``` FROM ubuntu:latest ``` 2、MAINTAINER 指定作者信息,如下: ``` MAINTAINER aming aming@aminglinux.com ``` 3、RUN 后面跟具体的命令 ``` RUN apt install -y curl ``` 也可以写成如下内容,相对比较复杂 ``` RUN ["apt","install","-y","curl" ] ``` 4、CMD 用来指定容器启动时用到的命令,只能有一条命令生效(如果写多个只有最后一条有效),格式如下: ``` CMD ["executable", "param1", "param2"] CMD command param1 param2 CMD ["param1", "param2"] ``` 示例如下: ``` CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"] ``` 5、EXPOSE 指定要映射的端口,格式如下: ``` EXPOSE <port1> <port2> <port3> ``` 示例-暴露22,80,8443三个端口,如下: ``` EXPOSE 22 80 8443 ``` * 说明:这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。 6、ENV 为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量,如下: ``` ENV MYSQL_version 5.7 ``` 7、ADD 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。例如: ``` ADD conf/vhosts /usr/local/nginx/conf ``` 8、COPY 类似于ADD,将本地文件拷贝到容器里,不过它不支持URL,例如: ``` COPY 123.txt /data/456.txt ``` * ADD和COPY只能使用相对路径 9、ENTRYPOINT 格式类似CMD 容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。 和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。 比如,容器名字为aming 我们在Dockerfile中指定如下CMD: ``` CMD ["/bin/echo", "test"] ``` 假如启动容器的命令是 ``` docker run aming ``` 则会输出 test 假如启动容器的命令是 ``` docker run -it aming /bin/bash ``` 则什么都不会输出 ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行 ``` ENTRYPOINT ["echo", "test"] ``` 假如启动容器的命令是 ``` docker run -it aming 123 ``` 则会输出 test 123 ,这相当于要执行命令 echo test 123 10、VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点 ``` VOLUME ["/data"] ``` 11、USER指定RUN、CMD或者ENTRYPOINT运行时使用的用户 ``` USER aming ``` 12、WORKDIR 为后续的RUN、CMD或者ENTRYPOINT指定工作目录 ``` WORKDIR /tmp/ ``` ## 5.2 Dockerfile示例 下面通过使用Dockerfile编译nginx镜像: 1、创建工作目录 ``` $ mkdir dockerfile_test $ cd dockerfile_test ``` 2、编写Dockerfile文件 ``` $ vim Dockerfile FROM ubuntu MAINTAINER axing axing@zhoumx.net RUN apt update RUN apt install -y libpcre2-dev net-tools gcc zlib1g-dev make ADD http://nginx.org/download/nginx-1.23.2.tar.gz . RUN tar zxvf nginx-1.23.2.tar.gz RUN mkdir -p /usr/local/nginx RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make install COPY index.html /usr/local/nginx/html/index.html EXPOSE 80 ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;" ``` * -g "daemon off"目的是让nginx在前台运行 * 容器特性:在容器环境,one container == one process,容器要能持续运行,必须有一个前台进程,nginx默认是以守护进程来运行的(daemon on),在后台默默提供服务,需要将nginx转为前台进程( daemon off);如果启动命令在后台运行,这个容器会终止。 3、创建index.html文件 ``` $ cd dockerfile_test $ echo "test" > index.html ``` 4、编译镜像 ``` $ docker build -t nginx:0.9 . ``` 说明: -t 后面跟镜像名字:tag, 这里的. 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录,如果想使用其它目录下的Dockerfile,还可以使用-f选项来指定,例如 ``` $ docker build -t nginx:1.0 -f /data/docker/nginx.dkf /tmp/ ``` 上面参数说明如下: - /tmp/:工作目录,比如COPY文件的时候,到/tmp/下面去找 5、使用镜像 ``` $ docker run -itd --name nginx01 -P nginx:0.9 ``` 因为是-P,端口随机分配,使用`docker ps`命令查看,容器80端口映射到49153(指定具体端口要用-p) ``` $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ec29e68bfca9 nginx:0.9 "/bin/sh -c '/usr/lo…" 4 seconds ago Up 3 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx01 ``` 6、验证 ``` $ curl localhost:49153/index.html test ``` # 6、docker-compose Docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。 我们可以在一个compose文件中定义一个多容器的应用(比如wordpress),然后通过该compose来启动这个应用。 ## 6.1 docker-compose安装 1、点击[官网地址](https://github.com/docker/compose/releases?q=2.12.2&expanded=true),选择需要的版本进行下载安装  2、下载完上传到机器的/usr/local/bin/目录下,给文件更名赋权 ``` $ mv docker-compose-linux-x86_64 docker-compose $ chmod a+x /usr/local/bin/docker-compose ``` 网络允许的情况可以通过命令下载 ``` $ curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose ``` 3、测试并查看版本 ``` $ docker-compose version ``` ## 6.2 docker-compose部署 1、编辑wordpress的compose yaml文件 ``` $ vim docker-compose.yml services: db: # 服务1:db image: mysql:5.7 # 使用镜像 mysql:5.7版本 volumes: - db_data:/var/lib/mysql # 数据持久化 restart: always # 容器服务宕机后总是重启 environment: # 环境配置 MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: # 服务2:wordpress depends_on: # wordpress服务启动时依赖db服务,所以会自动先启动db服务 - db image: wordpress:latest # 使用镜像 wordpress:latest最新版 ports: - "8000:80" #端口映射8000:80 restart: always environment: # 环境 WORDPRESS_DB_HOST: db:3306 # wordpress连接db的3306端口 WORDPRESS_DB_USER: wordpress # wordpress的数据库用户为wordpress WORDPRESS_DB_PASSWORD: wordpress # wordpress的数据库密码是wordpress WORDPRESS_DB_NAME: wordpress # wordpress的数据库名字是wordpress volumes: db_data: {} ``` 2、启动 ``` $ docker-compose up -d ``` 上面参数说明: - d:表示后台启动 3、查看 ``` $ docker-compose ps ``` 4、停止 ``` $ docker-compose stop ``` * 使用docker-compose管理容器或容器组,需要进入存放docker-compose.yml文件目录下执行
阿星
2024年1月6日 13:44
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码