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
Docker快速入门

  • 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快速入门

拉取指定版本镜像

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、点击官网地址,选择需要的版本进行下载安装

Docker快速入门

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文件目录下执行
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
Docker云原生

容器技术介绍

2025-4-9 8:30:58

Docker云原生

Containerd快速入门

2025-4-9 8:33:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
Index
本站支持IPv6访问