内核是3.1以上的

[root@localhost ~] #  uname -r 
5.14.0-427.13.1.el9_4.x86_64

docker开机自启动
docker update --restart=always 镜像id

系统版本

[root@localhost ~]# hostnamectl
   Static hostname: (unset)                           
Transient hostname: localhost
         Icon name: computer-vm
           Chassis: vm 🖴
        Machine ID: 1694271944ed4bceac37a8515cd424ba
           Boot ID: fda9b39bba374c9c9a09aab8d860bdd2
    Virtualization: vmware
  Operating System: Rocky Linux 9.4 (Blue Onyx)       
       CPE OS Name: cpe:/o:rocky:rocky:9::baseos
            Kernel: Linux 5.14.0-427.13.1.el9_4.x86_64
      Architecture: x86-64
   Hardware Vendor: VMware, Inc.
    Hardware Model: VMware20,1
  Firmware Version: VMW201.00V.21805430.B64.230522183

安装Docker

1 卸载旧版本

   sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  podman \
                  runc                 
# 2 需要的安装包
  yum install -y yum-utils device-mapper-persistent-data lvm2

# 3 设置镜像仓库 (设置阿里开源镜像仓库地址)
   # yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


  [[更新yum软件包索引]]
      yum makecache 
# 4 安装新版Docker相关源
   sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 
   
# 5 启动docer
   systemctl start docker

开机启动
   systemctl enable docker
# 6 测试Docker
   docker run hello-world
# 7 查看下载的镜像
   [root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   12 months ago   13.3k

debian安装docker

sudo apt update
sudo apt install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings 

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 

sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


sudo apt update


sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin


docker version

了解卸载镜像

# 1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

# 2. 删除资源
rm -rf /var/lib/docker
rm -rf /var/lib/containerd




## 阿里云镜像加速

~~~css
sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://77ut5a7j.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

Docker的常用命令


帮助命令

docker version       [[版本信息]]
docker info          [[系统信息(包括镜像和容器)]]
docker 命令 --help    [[万能命令]] 帮助

查看镜像

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   12 months ago   13.3kB

[[解释]]
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的ID	
CREATED     镜像的创建时间
SIZE        镜像的大小

[[可选项]]
  -a, --all             [[列出所有镜像]]
  -f, --filter filter   [[过滤(不经常用)]]
  -q, --quiet           [[只显示镜像id]]
  -aq                   [[也是只显示镜像id]]

搜索镜像

[root@localhost ~]# docker search mysql        
NAME                            DESCRIPTION                                     STARS     OFFICIAL
mysql                           MySQL is a widely used, open-source relation…   15079     [OK]
mariadb                         MariaDB Server is a high performing open sou…   5749      [OK]
percona                         Percona Server is a fork of the MySQL relati…   628       [OK]
[[解释]]
-f (filter[[过滤]] 

search      [[搜索]]
name        [[镜像名字]]
description [[描述]]
stars       [[点赞]]

下载镜像 docker pull (镜像名字) tag(版本)

[root@localhost ~]# docker pull mysql
Using default tag: latest            [[如果不写TAG]] 默认最新版本
latest: Pulling from library/mysql   
72a69066d2fe: Pull complete          [[分层下载]] docker image的核心 联合文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 [[签名]]
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest                 [[真实地址]]

docker pull mysql==docker.io/library/mysql:latest [[等价]]
[root@localhost ~]# docker pull mysql:5.7    [[指定5]].7版本
5.7: Pulling from library/mysql              #5.7版本
72a69066d2fe: Already exists                 [[分层可公用]]
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete                   #5.7分层
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

删除镜像

docker rmi 容器ID/容器名字                                 [[删除指定容器]]
docker rmi -f  容器ID/容器名字                             [[删除多个容器]]
[root@localhost ~]docker rmi -f $(docker images -aq)  # $查出镜像id 递归删除

容器命令


说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习

docker pull centos    [[下载一个centos]]

新建容器并启动

docker run [可选参数] image

[[参数说明]]
--name="name"      [[容器名字]] 用来区分容器
-d                 [[后台方式运行]]
-it                [[交互方式运行]] 进入容器查看内容
-P                 [[指定容器端口]]  8080    (大写)
       -p  主机端口:容器端口
       -p  容器端口:容器端口
-p                 [[随机指定端口]]          (小写)

测试

[root@localhost ~]# docker run -it centos /bin/bash             (启动并进入容器)
[root@e1bc46bb8833 /]#  ls                       [[查看容器内的centos]] 基础版本 命令不完善
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

        [root@e1bc46bb8833 /]# exit
         exit
        [root@localhost ~]#              (退出容器不运行)
        
-it     [[以交互模式运行容器,通常于-t一起使用]]       
-i:     [[以交互模式运行容器,通常于-t一起使用]]
-t:     [[为容器重新分配一个伪输入终端,通常于-i一起使用]]
-d:     [[后台运行容器,并返回容器ID;]]
-P:     [[随机端口映射,容器内部端口随机映射到主机的端口]]
-p:     [[指定端口映射,格式为:主机]](宿主)端口:容器端口

列出运行的容器

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

-a             [[列出当前正在运行的容器--(顺带带出历史运行的容器)]]
-n=x(数字)     [[显示最近创建的容器]]
-q             [[只显示容器的编号]]
-aq            [[显示当前容器的编号(顺带历史运行)]]
exis    [[直接停止并退出]]
ctrl+p+q   [[容器不停止退出]]

删除运行容器

docker rm 容器id           [[删除指定容器]] 不能删除正在运行的容 如果要强制删除 rm -f
docker rm -f $(docker ps -aq)           [[删除所有]] 
docker ps -a -q|xarfs docker rm   [[删除所有容器]]

启动和停止容器操作

docker start 容器id     [[启动容器]]
docker restart 容器id   [[重启容器]]
docker stop 容器id      [[停止容器]]
docker kill  容器id     [[干掉]]

常用其他命令

后台启用容器

# 命令 docker run -d 镜像名字
[root@localhost ~]# docker run -d centos 

docker ps 发现容器停止
[[常见]] docker 容器使用后台启动 必须要有一个前台进程,ocker发现没有应用,就会停止

查看日志

docker logs  -f -t --tail
# -tf 显示日志
# --tail number 显示日志条数

查看容器中的进程信息

# 命令 docker top 容器id

查看镜像的数据源

[root@localhost ~]# docker inspect  5d0da3dc9764
   {
        "Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "RepoTags": [
            "centos:latest"
        ],
        "RepoDigests": [
            "centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-09-15T18:20:05.184694267Z",
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 231268856,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/merged",
                "UpperDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/diff",
                "WorkDir": "/var/lib/docker/overlay2/c090bf2ce398566d4dad70018d607244b6646a9c737f059ea6154a9d2950aeff/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

进入当前正在运行的容器

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
c25a6d6f6ff2   centos    "/bin/bash"   About a minute ago   Up About a minute             kind_jang

[root@localhost ~]# docker exec -it centos bash

[root@e395d0e6e6f9 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@e395d0e6e6f9 /]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 14:28 pts/0    00:00:00 /bin/bash
root          16       1  0 14:28 pts/0    00:00:00 ps -ef


[[方式2]] docker attach 容器id

[[测试]]

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
e395d0e6e6f9   centos    "/bin/bash"   5 minutes ago   Up 5 minutes             unruffled_ellis
c25a6d6f6ff2   centos    "/bin/bash"   7 minutes ago   Up 7 minutes             kind_jang

[root@localhost ~]# docker attach c25a6d6f6ff2

[root@c25a6d6f6ff2 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[[docker]] exec [[进入容器后开启一个新的终端(可以在里面操作)]]
[[docker]] attach  进入容器正在执行的终端 不会启动新的进程

部署软件

安装nginx

[[搜索镜像]]
[root@localhost ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL
nginx                                             Official build of Nginx.                        19857     

[[下载镜像]]
[root@localhost ~]# docker pull nginx
Using default tag: latest
docker.io/library/nginx:latest

[[启动镜像]]
[[-d]] 后台运行
[[--name]] 容器名字
[[-p]] 端口号

[root@localhost ~]# docker run -d --name nginx01 -p 5566:80 nginx

[[查询运行的镜像]]
[root@localhost ~]# docker ps
d6262d770438   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:5566->80/tcp, :::5566->80/tcp   nginx01

[[后台打印]]
[root@localhost ~]# curl localhost:5566
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

[[停止]]
docker ps
docker stop 容器id

安装Tomcat

# 下载
[root@localhost ~]# docker pull tomcat

[[运行启动]]
[root@localhost ~]# docker run -d -p 8585:8080 --name tomcat01 tomcat

[[进入容器]]
[root@localhost ~]# docker exec -it tomcat01 /bin/bash

[[少命令]] Linux、命令少了   没有webapps

[root@localhost ~]# docker exec -it tomcat01 /bin/bash

[root@523cf2308d33:/usr/local/tomcat ] # cp -r webapps.dist/* webapp

部署 ES+kibana

# es暴露端口很多
# es 十分消耗内存
# es数据一般需要放置到安全目录挂载
# 拉取镜像
[root@localhost ~]#docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:8.13.4

# 查看内存
docker stats

部署1panel

(图形化工具 )

# 安装
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

[[命令]]
1pctl user-info  查看面板信息
1pctl status     查看启动状态








> 很多时候不符合十点半


# Docker镜
# 命令和git一致

donker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名:TAG


### commit测试

~~~shell
# 启动一个默认的tomcat

# 发现这个默认的tomcat webapps里面没有应用 拷贝进去进本文件

# 是同commit命令创建新容器


[root@localhost ~]# docker run -d -p 8080:8080 tomcat
6677ed6ae886ea08a95934434c3cbea0782a00652f0d526e9ecb5fabfc46f3bd

[root@localhost ~]# docker exec -it  6677ed6ae886 /bin/bash

root@6677ed6ae886:/usr/local/tomcat# cp -r webapps.dist/* webapps

[root@localhost ~]# docker commit -a="goudan" -m="webapps app" 6677ed6ae886 tomcat01:1.0
sha256:ab5411dea9c24e5acb6b91ab43819933edc56c6efd43d47ab800ef5cd74c92f5

[root@localhost ~]# docker images
\REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
tomcat01                 1.0       ab5411dea9c2   14 seconds ago   684MB

数据容器卷

什么是数据容器卷

docker理念回顾

将应用打包成一个镜像

如果数据在容器中,删除及丢失 ==数据==

mysql,容器删了,删库跑路 ==需求:mysql数据可以存地==

使用数据卷

方式1. 直接使用命令来挂载

docker run -it -v (虚拟机吗目录 docker容器目录)

[root@localhost ~]# docker run -it -v /home/cehsi:/home tomcat01:1.0 /bin/bash

[root@localhost home]# docker exec -it f7eecce03709 bash

[[查看是否创建成功]]
[root@localhost home]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS      NAMES
f7eecce03709   tomcat01:1.0   "/bin/bash"   6 minutes ago   Up 6 minutes   8080/tcp   jolly_germain

[root@localhost home]# docker inspect f7eecce03709  (查看挂载信息)

-v挂载
        "Mounts": [
            {
                "Type": "bind",        
                "Source": "/home/cehsi",    目的地主机内
                "Destination": "/home",     容器内的地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
ps:修改只需要在本地修改即可 容器内会自动同步

实战测试:安装mysql

思考:mysql数据持久化的问题

[[获取镜像]]
[root@localhost ~]# docker  pull mysql    (下载镜像)

[[运行容器]] 需要挂载数据  [[安装启动]] 需要配置密码
-d 后台运行 -p端口映射 -v 数据卷挂载 -e 环境配置 --name 命名 -it 伪终端 
[root@localhost ~]# docker run -d -it -p 3310:3306 -v /home/mysql/conf.d:/etc/mysql/conf.d  -v /home/mysql/data:/var/lib/mysql/datda.d -e MYSQL_ROOT_PASSWORD=990601.Ao --name mysql01 mysql:5.7

[[删除容器]] 挂载的也不会丢失 实现了数据持久化

具名和匿名挂载


# 匿名挂载
-v 容器命令 -P (大写 随机映射端口)
docker run -d -P --name neinx01 -v /etc/nginx  nginx

[[查看所有的volume]] 的情况
[root@localhost ~]# docker volume ls
local     fa27e35884f38704f09958ed91a8918504b0771a508e635d51a17496f776e615
local     portainer_data
[[匿名挂载]] 在-v 只写了容器路径 没有写容器外的路径
[[具名路径]] 
[root@localhost ~]# docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx
612f141ea2fdf332dac5bbae8a7a7aec97deec3e3b8bc492dbc29691a6aeccab

[root@localhost ~]# docker volume ls
local     juming-nginx

[[通过]] -v 卷名:容器内路径
[[查看这个卷]]

所有的docker容器内的卷 没有指定目录的情况下 都是在 ==/var/lib/docker/volumes/xxxxx/_data==

通过具名挂==载可以方便我们==找到我们的一个卷 大多数情况使用 ==具名挂载==

[[如何确定使用具名挂载还是匿名挂载,还是指定路径挂载]]
-v 容器内路径             [[匿名挂载]]
-v 卷名:容器内路径        [[具名挂载]]
-v /宿主机路径:容器内路径  [[指定路径挂载]]

拓展:

docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly   [[只读]]
rw readweite  [[可读可写]]

[[设置了这个容器权限]] 容器对挂出来的内容就有限定了
docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx:ro nginx
docker run -d -P --name neinx002 -v juming-nginx:/etc/nginx nginx:rw nginx

[[ro]] 只要看到就说明只能通过宿主机惭怍 容器内部是无效的

初识dockerfile

dockerfile是用来构建Docker镜像的构建文件 命令脚本 体验装

用过脚本可以生成镜像 镜像是一层一层的 简脚本是一个一个的命令 每个命令都是一层

[[创建一个dockerfile文件名字可以随机]] 建议dockerfile
[root@localhost ~]# cd /home
[root@localhost home]# mkd
mkdict    mkdir     mkdosfs   mkdumprd  
[root@localhost home]# mkdir docker-test-volume
[root@localhost home]# ls
cehsi  docker-test-volume  mysql
[root@localhost home]# cd  docker-test-volume
[root@localhost docker-test-volume]# pwd
/home/docker-test-volume

[[dockerfile]] 编辑
 [[文件中的内容]] 指令大写 参数
FROM centos

VOLUME ["/volume01"]

CMD echo "---end---"
CMD /bin/bash

[[生成]]
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile  -t goudan/centos:1.0 .        (最后面点不能少 -f 本地镜像 -t 生成镜像)

[[查看]]
[root@localhost docker-test-volume]# docker images
goudan/centos            1.0       278dc8e1ca8e   2 years ago   231MB

[[启动]]
[root@localhost ~]# docker run -it goudan/centos:1.0 /bin/bash

这个卷和外部一定有同步的目录     (以上是匿名挂载)

[[查看互通]]
[root@8699b3170f83 /]# cd volume01/
[root@8699b3170f83 volume01]# touch container.txt
[root@8699b3170f83 volume01]# ls
container.txt

[[查看匿名挂载]]   inspect 容器内容
[root@localhost ~]# docker inspect 8699b3170f83
"Mounts":/var/lib/docker/volumes/fa280abee28d4df9524b3813d69390fea7793412ca2aea5bff5b1d22db2e8495/_data

[root@localhost]# cd /var/lib/docker/volumes/fa280abee28d4df9524b3813d69390fea7793412ca2aea5bff5b1d22db2e8495/_data
[root@localhost _data]# ls
container.txt

数据卷容器

多个centos同步数据

[[启动三个容器]] 通过自己写的镜像启动
docker run -d -it  --name centos01 goudan/centos:1.0
docker run -d -it --name centos02 --volumes-from centos01 goudan/centos:1.0
docker run -d -it --name centos03 --volumes-from centos01 goudan/centos:1.0

# --volumes-from 多容器数据共享

多个mysql实现数据共享

[root@localhost ~]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/b/mysql -e MYSQL_ROOT_PASSWORD=990601.Ao  --name mysql01 mysql:5.7

[root@localhost ~]# docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=990601.Ao --name mysql02 --volumes-from mysql01 mysql:5.7

[[可以实现两个数据库同步]]

结论:

容器之间配置信息的传递 数据卷容器的生命周期一直持续到没有容器使用为止

但是一旦持久化到了本地 这时候本地的数据是不会删除的

Dockerfile

dockerfile介绍

dockerfile是构建docker镜像的文件 命令参数脚本

构建步骤

1.编写dockesfile文件

2.docker build构建成为一个镜像

3.docker run 运行镜像

4.docker push 发布镜。Docker Hub,阿里云镜像仓库)

官方很多镜像都是基础包 很多功能都没有 我们通常自己搭建自己的镜像

Dockerfile构建过程

基础知识

  • 每个保留关键字(指令)必须是大写字母
  • 指令是从上到下顺序执行
  • [[表示注释]]
  • 每一个直径都会创建提交一个镜像层,并提交

dockerfile是面向开发的 以后需要发布项目 做镜像 就需要编写dockerfile文件 文件十分不简单

docker镜像逐渐成为企业交付标准 必须要掌握

步骤:开发,部署,上线运维

dockerfile:构建文件,定义了一切的步骤,源代码

dockerimages:通过dockerfile构建生成的镜像,就是最终要发布运行的产品

docker容器:容器就是镜像运行提供服务的

dockerfile指令

==FROM== 指定基础镜像(镜像的妈妈是谁)

==MAINTAINER== 指定维护者信息(告诉别人,谁负责养她)

==RUN== 在命令前面加run即可(你想让她干啥)

==ADD== copy文件,会自动解压(给他点创业资金)

==WORKDIR== 设置当前工作目录(我是cd 今天刚化了妆)

==VOLUME== 设置卷,挂载主机目录(给他一个存放行李的地方)

==EXPOSE== 指定对外的端口(他要打开的门是啥)

==RUN== 指定容器要干的事情(奔跑吧)

==CMD== 指定这个容器启动的时候运行的命令,只有最后一个生效(可被替代)

==ENTRYPOINT== 指定这个容器启动的时候运行的命令 可以追加命令

==COPY== 类似ADD 将我们的文件拷贝到镜像中

==ENV== 构建的时候设置环境变量

实战测试

Docker Hub中99%的镜像都是从基础镜像FROM scratch过来的 然后配置需要的软件和配置来进行构建

创建自己的rockylinux

[[编写dockerfile文件]]
[root@localhost dockerfile]# cat mydockerfile-centos 
FROM  rockylinux       
MAINTAINER  goudan<4484651@qq.com>

ENV MYPATH /user/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80       

CMD echo $MYPATH
CMD "---end---"
CMD /bin/bash  



[root@localhost dockerfile]# docker build -f mydockerfile-centos -t mylinux:1.00 .
[[命令]] docker build -f 文件路径 -t 镜像名字:版本号

[[测试运行]]
[root@localhost dockerfile]# docker run -it --name linux01 mylinux:1.00

[root@localhost dockerfile]# docker run -it --name linux02 mylinux:1.00
[root@b75b17a7f1b2 local]# pwd
/user/local              [[默认进的根目录]]
[[查看镜像的构造过程]]
[root@localhost dockerfile]# docker history 7721b0d7bf1a
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
7721b0d7bf1a   5 hours ago   CMD ["/bin/sh" "-c" "/bin/bash"]                0B        buildkit.dockerfile.v0
<missing>      5 hours ago   CMD ["/bin/sh" "-c" "\"---end---\""]            0B        buildkit.dockerfile.v0
<missing>      5 hours ago   CMD ["/bin/sh" "-c" "echo $MYPATH"]             0B        buildkit.dockerfile.v0
<missing>      5 hours ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      5 hours ago   RUN /bin/sh -c yum -y install net-tools # bu…   13.3MB    buildkit.dockerfile.v0
<missing>      5 hours ago   RUN /bin/sh -c yum -y install vim # buildkit    67.9MB    buildkit.dockerfile.v0
<missing>      5 hours ago   WORKDIR /user/local                             0B        buildkit.dockerfile.v0
<missing>      5 hours ago   ENV MYPATH=/user/local                          0B        buildkit.dockerfile.v0
<missing>      5 hours ago   MAINTAINER goudan<4484651@qq.com>               0B        buildkit.dockerfile.v0
<missing>      2 years ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 years ago   /bin/sh -c #(nop) ADD file:790b4c6a174560d47…   205MB  


[[history]] 查看构造目录

CMD和ENTRYPOINT的区别

[[cmd配置]]
[root@localhost dockerfile]# vim dockerfile-cmd
[root@localhost dockerfile]# cat dockerfile-cmd 
FROM rockylinux
CMD ["ls","-a"]

[[制作镜像]]
[root@localhost dockerfile]# docker build  -f dockerfile-cmd  -t cmdtest:1.0 .

[[启动镜像]] 发现ls -a 生效了
[root@localhost dockerfile]# docker run cmdtest:1.0
.
..
.dockerenv
bin
dev
[root@localhost ~]# docker run 4185992a7dfa -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
[[cmd的情况下-l]] 替换了cmd["ls",-a]命令,-l不是命令所以报错

==ENTRYPOINT==

[[编辑entrypoint]]
[root@localhost dockerfile]# vim dockerfile-ENTRYPOINT
[root@localhost dockerfile]# cat dockerfile-ENTRYPOINT 
FROM rockylinux
ENTRYPOINT ["ls","-a"]

[[制作镜像]]
docker build -f dockerfile-ENTRYPOINT -t entrypoint:1.0 .
[[执行镜像]]
[root@localhost dockerfile]# docker run entrypoint:1.0 
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found

[[追加命令]] -l (成功) 追加的命令直接拼接在我们的entrtpoint后面
[root@localhost dockerfile]# docker run entrypoint:1.0 -l
total 4
drwxr-xr-x.   1 root root    6 Jun  6 15:10 .
drwxr-xr-x.   1 root root    6 Jun  6 15:10 ..
-rwxr-xr-x.   1 root root    0 Jun  6 15:10 .dockerenv
lrwxrwxrwx.   1 root root    7 Oct 11  2021 bin -> usr/bin
drwxr-xr-x.   5 root root  340 Jun  6 15:10 dev

dockerfile中很多命令都十分相似 需要去了解他们的区别 最好就是对比他们的测试效果

doker提交镜像

  • 注册自己账号
  • 确定这个账号可以登录
  • 在服务器上面提交镜像
docker login -u
输入密码
# 提交镜像 docker push

失败
[[增加一个tag]]
 docker tag 镜像ID 镜像:TAG
[[提交镜像也是按照镜像层级来提交]]

DOCKER网络

网络模式

docker采用

bridge 桥接docker(默认 自己创建也是用bridge模式)

none : 不配置网络

host : 和宿主机共享网络

container : 容器网络联通 局限性大

测试

# 直接启动命令 --net bridge 这个就是我们的docker0
docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 --net bridge tomcat 

[[docker0]] 特点: 默认:不能域名访问    --link可以打通 局限性太大

[[可以自定义网络]]

自定义网络

==自定义配置==

# --driver bridge
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1 

配置命令
# docker network create --driver bridge  --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[[好处:]] 自己自定义网络 功能比较全 可以域名访问 推荐

redis:不同的集群使用不同的网络,保证集群是安全健康的

文章作者: 叫我狗蛋
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我要肝网络
Linux
喜欢就支持一下吧