4.Dockerfile

Dockerfile

Dockerfile是由一行行指令语句构成的一个创建docker镜像的配置文件。Dockerfile是由三个部分组成:基础镜像(必须的)、运行指令、容器默认执行命令。

1、FROM

FROM 指定基础镜像,目的是为了给构建镜像提供一个基础环境。

2、MAINTAINER

指定维护者信息

3、RUN

基于FROM指定的docker镜像运行一个指令,将结果反映到新生成的镜像。RUN指令后面执行的命令必须是镜像中已经存在了的命令。

4、CMD

指定容器运行的默认命令

nginx -g "daemon off;"

5、昨天的作业

使用dockerfile创建一个nmp

centos  =>  下载源码包  => 解决依赖  => ./configure  => make => make install

6、ADD和COPY

ADD : 将本地文件添加到镜像
    ADD支持自动解压,但是仅仅支持解压tar包
    ADD支持远程下载,但是不会解压下载内容

COPY : 将文件复制到镜像

7、ENV

设置一个容器的环境变量

8、EXPOSE

指定容器需要向外界暴露的端口,实际上没有暴露,只有指定了EXPOSE才能够使用-P, 可以指定多个端口

9、ARG

指定运行时参数,用于构建docker镜像时传入参数 --build-arg=USER=root

10、VOLUME

设置需要挂载的目录,没有实现挂载。

11、WORKDIR

设置工作目录

1、程序运行的开始目录
2、进入容器的最初目录

12、ONBUILD

ONBUILD 后面跟的是Dockerfile指令不是linux命令

构建触发器  : 当当前镜像用作基础镜像时触发

13、案例

[root@Centos7 nginx]# docker network create lnmp
c7ad0d637a1455ebd5ea9d08e23f5d13971a0172a910ddc8bd4649a68ee27fc4

# 创建nginx
[root@Centos7 nginx]# vim Dockerfile 
FROM nginx
RUN useradd www
ADD default.conf  /etc/nginx/conf.d/
ADD nginx.conf  /etc/nginx
EXPOSE 80
WORKDIR /root
CMD nginx -g "daemon off;"

## 修改nginx.conf
user  www;

## 修改default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }
    location ~ \.php$ {
        root           /usr/share/nginx/html;
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
        include        fastcgi_params;
    }
}

# 创建PHP
[root@Centos7 php]# vim Dockerfile 
FROM centos:7
RUN yum install php php-devel php-fpm -y
RUN useradd www
ADD www.conf /etc/php-fpm.d/
EXPOSE 9000
CMD ["php-fpm"]

## 修改www.conf
listen = 9000
;listen.allowed_clients = 127.0.0.1
user = www 
group = www
request_terminate_timeout = 0

# 创建mysql
docker rm -f mysql && docker run -d --name mysql --network=lnmp -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

注:

dockerfile执行是按照从上到下

如果构建的上一个镜像执行过此步骤,下一个则可以使用缓存(Using cache)

1、从互联网下载内容不会使用缓存
2、添加文件的内容(ADD、COPY)

如果上一步修改过,则下面的dockerfile步骤全部不使用缓存。

3.docker容器

docker容器

容器就是对外提供服务的一个实例。

容器启动的必要条件:容器内至少有一个进程运行在前台

1、创建容器

# 格式
    docker run [参数] [镜像名称] [运行容器的启动命令]

# 参数
    -d : 以守护进程的方式运行一个容器
        docker run -d [镜像名称] [cmd]

    --name : 指定容器的名称
        docker run -d --name [容器名称] [镜像的名称] [cmd]

    -p : 指定端口映射
        docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]

    -P :随机端口映射
        docker run -d -P [镜像名称] [cmd]

    -i : 打开标准输出

    -t : 创建一个伪终端
        docker run -it [镜像名称] [cmd]

    -v : 挂载目录到容器中
        docker run -v 宿主主机目录:容器内目录  [镜像名称] [cmd]

    --rm : 容器生命周期结束时立即删除
        docker run --rm [镜像名称] [cmd]

    -e : 在容器中创建一个环境变量
        docker run -e NAME=Centos -d [镜像名称] [cmd]

    --link : 连接上一个容器,实现网络互通
        docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]

    -h : 设置容器主机名
        docker run -h "主机名"  [镜像名称] [cmd]

# docker run 运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID

2、查看本机的容器列表

# 格式    
    docker ps [参数]
    docker ps # 查看当前系统中正在运行的容器列表

#参数
    -a : 查看系统中所有的容器。
    -q : 仅显示容器的ID

1616137673048

3、停止和启动一个容器

# 停止
    docker stop [容器的ID|名称]

# 启动(该容器必须是系统已经存在的容器)
    docker start [容器的ID|名称]

4、删除容器

# 格式
    docker rm [容器名称|ID]

# 参数
    -f : 强制删除
    docker rm -f [容器名称|ID]

# 清空容器
docker rm $(docker ps -a -q)

5、查看容器内容

# 格式
    docker inspect [容器名称|ID]

# 怎么监控docker运行状态?
docker inspect -f '{{.State.Running}}' nginx

6、复制命令

1、复制到容器内
    docker cp [宿主主机文件路径]  容器ID:容器内路径

2、复制到容器外
    docker cp 容器ID:容器内路径 [宿主主机文件路径]

7、进入容器

# 进入容器一般有四种

1、exec : 在容器外向容器内执行一个命令(官方推荐)
    docker exec [参数] [容器的名称|ID] [cmd]

2、attach : 在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了)
    docker attach [容器ID|名称]

3、nsenter : 建立一个管道连接上容器主ID
    nsenter --target $( docker inspect -f {{.State.Pid}} 30d369d70bcd) --mount --uts --ipc --net --pid

4、ssh : 通过ssh连接

2.docker 的基本使用

docker 的基本使用

docker 中的三大基本概念

镜像

镜像就是启动一个容器的模板。

容器

容器就是对外提供服务的进程。或者容器就是镜像启动起来的一个实例。

仓库

仓库是用来存放镜像的地方。

docker 镜像相关命令

  • 常用镜像仓库

    官方仓库:hub.docker.com
    自己的私有仓库:Harbor
    阿里云私有仓库:registry.cn-hangzhou.aliyuncs.com
  • 搜索镜像

    #格式
    docker search [镜像名称]
    # 实例

    1616054667174

  • 拉取镜像

    # 格式
    docker pull [镜像名称]
    # 实例
    [root@Centos7 ~]# docker pull redis
    Using default tag: latest
    latest: Pulling from library/redis
    
    # 镜像层
    a076a628af6f: Already exists 
    f40dd07fe7be: Pull complete 
    ce21c8a3dbee: Pull complete 
    ee99c35818f8: Pull complete 
    56b9a72e68ff: Pull complete 
    3f703e7f380f: Pull complete 
    
    # 镜像ID号(镜像ID号是全球唯一)
    Digest: sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
    
    # 镜像下载状态
    Status: Downloaded newer image for redis:latest 
    
    # 镜像的全称(镜像的tag)
    docker.io/library/redis:latest
    
  • 查看当前系统上的有哪些镜像

    # 格式
    docker images 或者 docker image ls
    
    # 参数
    -q : 只显示镜像ID
    [root@Centos7 ~]# docker images -q
    621ceef7494a
    f6d0b4767a6c

    1616055423200

  • 获取镜像的详细信息

    # 格式
    docker inspect [镜像名称或镜像ID]
    
    # 参数
    -f : 格式化输出
    [root@Centos7 ~]# docker inspect -f '{{.Id}}' 621ceef7494a
    sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
    [root@Centos7 ~]# docker inspect -f '{{.ContainerConfig.Hostname}}' redis
    16535cfaf84a
  • 登录镜像仓库

    # 格式
    docker login 
    注: 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
    
    # 实例
    [root@Centos7 ~]# docker login registry.cn-hangzhou.aliyuncs.com
          Username: yangyang091022
          Password: 
          WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
          Configure a credential helper to remove this warning. See
          https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    
          Login Succeeded
    [root@Centos7 ~]# cat ~/.docker/config.json 
      {
          "auths": {
              "registry.cn-hangzhou.aliyuncs.com": {
                  "auth": "eWFuZ3lhbmcwOTEwMjI6Y2hlbjE4NzkwMDcwODMw"
              }
          }
      }
    # 参数
    --username|-u : 指定用户名
    --password|-p : 指定密码
  • 为镜像标签

    # 镜像标签的构成
    docker.io/library/redis:latest
    docker.io  : 镜像仓库的URL
    library    :镜像仓库命名空间
    redis    : 镜像名称
    latest       : 镜像版本号
    
    # 打标签
    # 格式
        docker tag [镜像ID]  镜像标签
    [root@Centos7 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    redis        latest    621ceef7494a   2 months ago   104MB
    nginx        latest    f6d0b4767a6c   2 months ago   133MB
    [root@Centos7 ~]# docker tag 621ceef7494a registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
    [root@Centos7 ~]# docker images
    REPOSITORY                                        TAG       IMAGE ID       CREATED        SIZE
    redis                                             latest    621ceef7494a   2 months ago   104MB
    registry.cn-hangzhou.aliyuncs.com/alvinos/redis   v2        621ceef7494a   2 months ago   104MB
    nginx                                             latest    f6d0b4767a6c   2 months ago   133MB
    
  • 镜像上传

    # 格式
    docker push [镜像标签]
    
    # 注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
    
    [root@Centos7 ~]# docker push registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
    The push refers to repository [registry.cn-hangzhou.aliyuncs.com/alvinos/redis]
    3480f9cdd491: Pushed 
    a24a292d0184: Pushed 
    f927192cc30c: Pushed 
    1450b8f0019c: Pushed 
    8e14cb7841fa: Pushed 
    cb42413394c4: Pushed 
    v2: digest: sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892 size: 1572
  • 镜像的删除

    # 格式
    docker rmi [镜像名称或者镜像ID]
    # 实例
    [root@Centos7 ~]# docker rmi nginx
    # 参数
    -f  : 强制删除
    [root@Centos7 ~]# docker rmi -f nginx
      Untagged: nginx:latest
      Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
    # 注:当有容器正在使用镜像时,强制删除镜像,只能删除镜像的所有tag, 不会删除镜像。
  • 清空镜像

    # 格式
    docker image prune
    
    # 实例
    [root@Centos7 ~]# docker image prune
      WARNING! This will remove all dangling images.
      Are you sure you want to continue? [y/N] y
      Total reclaimed space: 0B
    # 参数
    -a : 删除所有镜像
    
    [root@Centos7 ~]# docker image prune -a
    WARNING! This will remove all images without at least one container associated to them.
    Are you sure you want to continue? [y/N] y
    Deleted Images:
    untagged: redis:latest
    untagged: redis@sha256:0f97c1c9daf5b69b93390ccbe8d3e2971617ec4801fd0882c72bf7cad3a13494
    untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/redis:v2
    untagged: registry.cn-hangzhou.aliyuncs.com/alvinos/redis@sha256:7ef832c720188ac7898dbd8d1e237b0738e94f94fc7e981cb7b8efe84555e892
    deleted: sha256:621ceef7494adfcbe0e523593639f6625795cc0dc91a750629367a8c7b3ccebb
    deleted: sha256:de66cfbf4712b8ba9ef292e08ef7487be26d9d21b350548e400ae351405d820e
    deleted: sha256:79b2381e35429e8fc04d31b3445f069c22d288bf5c4cba7b7c10004ff78ae201
    deleted: sha256:1d047d19be363b00139990d4d7f392dabdb0809dbc9d0fbe67c1f15b8caed27a
    deleted: sha256:8c41f4e708c37059df28ae1cabc200a6db2fee45bd3a2cadcf70f2765bb68730
    deleted: sha256:b51317bef36fe1900be48402c8a41fcd9cdb6b8950c10209f764473cb8323371
    
    Total reclaimed space: 35.04MB
    [root@Centos7 ~]# 
    
  • 查看镜像历史(镜像的构建历史)

    # 格式
    docker history [镜像ID或镜像名称]
    # 实例
    [root@Centos7 ~]# docker history alpine
    IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
    7731472c3f2a   2 months ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B        
          2 months ago   /bin/sh -c #(nop) ADD file:edbe213ae0c825a5b…   5.61MB    
  • 保存镜像(commit)

    # 保存正在运行的容器直接为镜像
    # 格式:
    docker commit [容器ID|容器名称]
    
    # 实例
    [root@Centos7 ~]# docker commit -a "Alvin" -m "这是一个docker镜像" -p be3b92e2886b  test:v1
    sha256:4a06cd2af42877b5e2908073061f7ae1bf9e308a470bdfc0c6f906ef368aaed8
    [root@Centos7 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
    test         v1        4a06cd2af428   5 seconds ago   104MB
  • 保存镜像(import/export)

    # 保存正在运行的容器为镜像压缩包
    ## 保存容器为镜像
    docker export [容器的ID] > [包名称]
    # 实例
        [root@Centos7 ~]# docker export be3b92e2886b > redis.tar
          [root@Centos7 ~]# ll | grep redis
          -rw-r--r--. 1 root root 104178688 Mar 18 17:30 redis.tar
    
    ## docker import [包名称] [自定义镜像名称]
    # 实例
    [root@Centos7 ~]# docker import redis.tar test:v3
      sha256:7776db3402fb8d59f6121a3b1977b5e7016f4064cf59218fd1b06637cb0fca87
      [root@Centos7 ~]# docker images
      REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
      test         v3        7776db3402fb   6 seconds ago   101MB
  • 保存镜像(save/load)

    # 保存镜像为压缩包
    # 保存镜像的格式:
    docker save [镜像名称|镜像ID] > [包名称]
      [root@Centos7 ~]# docker save 7731472c3f2a > apline.tar
      [root@Centos7 ~]# ll  
      -rw-r--r--. 1 root root   5888000 Mar 18 17:36 apline.tar
      [root@Centos7 ~]# docker save -o apline-two.tar 7731472c3f2a
      [root@Centos7 ~]# ll
      total 148692
      -rw-r--r--. 1 root root   5888000 Mar 18 17:36 apline.tar
      -rw-------. 1 root root   5888000 Mar 18 17:37 apline-two.tar
    
    # 导入镜像的格式:
    docker load < [包名称]
    
    [root@Centos7 ~]# docker load < apline.tar 
      c04d1437198b: Loading layer [========================================>]   5.88MB/5.88MB
      Loaded image ID: sha256:7731472c3f2a25edbb9c085c78f42ec71259f2b83485aa60648276d408865839
      [root@Centos7 ~]# docker images
      REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
                 7731472c3f2a   2 months ago     5.61MB
    
    # 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
    [root@Centos7 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    busybox      latest    b97242f89c8a   2 months ago     1.23MB
    [root@Centos7 ~]# docker save busybox:latest > busybox.tar
    [root@Centos7 ~]# ll
    total 150120
    -rw-r--r--. 1 root root   1459200 Mar 18 17:43 busybox.tar
    [root@Centos7 ~]# docker rmi b97242f89c8a
    Untagged: busybox:latest
    Untagged: busybox@sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f
    Deleted: sha256:b97242f89c8a29d13aea12843a08441a4bbfc33528f55b60366c1d8f6923d0d4
    Deleted: sha256:0064d0478d0060343cb2888ff3e91e718f0bffe9994162e8a4b310adb2a5ff74
    [root@Centos7 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    [root@Centos7 ~]# docker load < busybox.tar 
    0064d0478d00: Loading layer [==================================================>]   1.45MB/1.45MB
    Loaded image: busybox:latest
    [root@Centos7 ~]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
    busybox      latest    b97242f89c8a   2 months ago     1.23MB
    
  • 保存镜像三种方式的区别

    1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
    2、export可以重命名镜像名称而save则不行
    3、save可以同时保存多个镜像而export则不行

1.docker 安装

docker 安装

1、如果之前安装过docker,需要自行卸载

sudo yum remove docker docker-common docker-selinux docker-engine -y

2、初始化系统环境

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3、安装yum源

wget -O /etc/yum.repos.d/docker-ce.repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

yum clean all
yum makecache

4、安装docker

yum install docker-ce -y

5、docker优化

打开阿里云官网  产品  --> 容器与中间件  -->  容器与镜像服务ACR --> 管理控制台 --> 镜像加速器 --> CentOS

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

6、设置开机自启动

systemctl enable --now docker

7、检查docker

# 第一种方式
docker run -d -P nginx

# 第二种方式
docker info