Docker学习

1、docker

docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

2、初识docker

开发环境 ->  测试环境 -> 生产环境

3、安装docker

# 1、切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须指定 --setopt=obsoletes=0,否则yum会自动安装更高版本。
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y 
# 4、添加一个配置文件
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用sysetemd来代替cgroupfs
mkdir /etc/docker
cd /etc/docker
touch daemon.json
 
通过vi编辑器输入一下内容
{
  "registry-mirrors":["https://nh2pqkbt.mirror.aliyuncs.com"],
  "insecure-registries":["192.168.31.101:5000"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
 
#5、启动docker
systemctl enable docker
systemctl restart docker


# 6、查看docker版本,验证是否安装成功
docker -v

4、docker架构

镜像(Image)

容器(Container)

仓库(Repository)

5、配置docker镜像加速器(安装时已配置无需做)

设置docker国内镜像源【国内镜像源大全】_docker镜像网站-CSDN博客

1、创建文件:touch  /etc/docker/daemon.json

2、然后vi编辑器输入以下内容

{
  "registry-mirrors": ["https://nh2pqkbt.mirror.aliyuncs.com"]
}

上述内容如果拷贝的网页上的,注意删除下看不见的空格,否则很容易因为看不见的字符导致json格式解析失败,进而导致docker启动失败,最好是拷贝到一个纯文本文件中(不带格式),调整以下再拷贝。如果实在不行就手动输入,切注意使用英文输入法。


3、重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

6、docker命令——服务相关命令

启动:systemctl start docker

状态:systemctl  status docker

停止: sysetmctl stop docker

重启:sysetmctl restart docker

开机自启动: systemctl enable docker

7、docker命令——镜像相关命令

查看:docker images

搜索:docker seearch redis(搜索“redis”)

拉取:docker pull redis (默认latest版本)

拉取:docker pull redis:5.0(下载5.0版本,镜像有哪些版本需要去hub上自己去查)

删除:docker rmi  imgae_id (image输入具体的镜像id)

删除: docker rmi name:tag (由于相同name可能有不同的tag,所以需要name+tag)

全部删除: docker rmi `docker images -q` (docker images -q查看所有镜像的id)

8、docker命令——容器相关命令1

创建容器:docker run -it --name=c1 centos:7  /bin/bash    (-i 保持运行,-t分配终端 ,--name起名字, /bin/bash  进入容器的初始化指令) ※交互式容器

创建容器:docker run -id --name=c1 centos:7 (-i 保持运行,-d后台运行,退出容器容器不关闭 ,--name起名字) ※守护式容器

exit 退出容器,回到宿主机

查看容器;:docker ps (正在运行的)

查看容器:docker ps -a (所有容器)

进入容器:docker exec -it C2 bin/bash

补充:docker run -e TZ=Asia/Shanghai --name your_container_name -d your_image

-e指定时区

9、docker命令——容器相关命令2

停止容器:docker stop 容器ID/容器名称 

启动容器:docker start 容器ID/容器名称

删除容器:docker rm  容器ID/容器名称 

删除所有:docker rm `docker ps -aq` (运行状态的无法删除)

查看容器信息: docker inspect 容器ID/容器名称

10、docker 容器数据卷——数据卷概念以及作用

11、docker 容器数据卷——配置数据卷(持久化)

docker run -id --name=c1 -v /root/data:/root/data_container centos:7

touch a.txt 创建一个文件,exit到宿主机,然后cd 到  /root/data 下查看文件。删除c1后,宿主机的data目录依然存在。

-v参数可以设置多个,实现一个容器挂载多个目录。

12、docker 容器数据卷——配置数据卷2(容器间通信)

多个容器挂载同一个目录,操作步骤同上。效果如如图。

13、docker 容器数据卷——数据卷容器

1、创建启动c3数据卷容器,使用-v参数设置数据卷

docker run -id --name=c3 -v  /volume centos:7

2、创建启动 c1 c2 容器,使用 --volumes-from 参数设置容器卷

docker run -id --name=c1 --volumes-from c3 centos:7

docker run -id --name=c2 --volumes-from c3 centos:7

3、通过touch 文件查看各个容器的volume目录的文件同步情况。

只是一种简便的配置的方式,即使c3不在运行状态,c1 c2运行不受影响。可以通过docker inspect命令查看这几个容器,他们的Mounts节点信息是一样的。

14、docker应用部署——部署mysql

1、搜索mysql镜像

docker search mysql

2、拉取mysql镜像

docker pull mysq 5.6

3、创建容器,设置端口映射、目录映射。

# 在root目录下创建mysql目录,用于存储mysql信息

mkdir ~/mysql

docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/logs:/logs \
-v /root/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6

遗留:对于诸多的中间件,如果需要在docker里部署,第一手的资料是从docker的相关资料文档上去找,还是去该中间件的官方文档去找。

15、docker应用部署——部署tomcat

1、搜索tomcat镜像

docker search tomcat

2、拉取tomcat镜像

docker pull tomcat 

3、创建容器、设置端口映射、目录映射

mkdir  /root/tomcat

docker run -id --name=c_tomcat \
-p 8080:8080 \
-v  /root/tomcat/:/usr/local/tomcat/webapps \
tomcat

4、验证

cd /root/tomcat

mkdir test

cd test

touch index.html

最后随便在index.html里写点html代码,然后再浏览器里访问 http://宿主机IP:8080/test/index.html

16、docker应用部署——部署nginx

1、搜索nginx镜像

docker search nginx

2、拉取nginx镜像

docker pull nginx

3、准备工作

mkdir  /root/nginx

cd /root/nginx

mkdir  conf   

cd  conf

vim nginx.conf  (内容直接用nginx安装包里的nginx.conf文件,因为这个文件是nginx的核心配置文件,是需要根据业务调整的,因此需要通过挂载的方式保存在宿主机上)


#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

4、创建容器、设置端口映射、目录映射

docker run -id --name=c_nginx \
-p 80:80 \
-v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /root/nginx/logs/:/var/log/nginx \
-v /root/nginx/html:/etc/nginx/html \
nginx

注意:不同版本的nginx,目录结构有可能有所不同。

17、docker应用部署——部署redis

1、搜索redis镜像

docker search redis

2、拉取redis镜像

docker pull redis:5.0

3、创建容器、设置端口映射

docker run -id \
-p 6379:6379 \
--name c_redis \
-v /root/redis/redis.conf:/etc/redis/redis.conf \
-v /root/redis/data:/data \
redis:5.0 

 遗留:redis的配置文件,持久化等。

4、使用外部机器链接redis,或者其他UI客户端

./redis-cli.exe -h 192.168.31.101 -p 6379

18、dockerfile——镜像原理

Linux文件系统:

分层的文件系统:

19、dockerfile——容器转为镜像

目录挂载的内容不会打到新的镜像里,因为他们实际存在在宿主机的目录里。

20、dockerfile——dockerfile概述以及关键字

常见命令:

21、dockerfile——案例——部署springboot项目

 

dockerfile文件示例:

FROM java:8
MAINTAINER zhaojufei
ADD web-openapi-1.0.0.jar app.jar
CMD java -jar app.jar

构建镜像命令:docker build -f ./springboot_dockerfile -t app .
需要把jar包ftp到linux某个目录,并且dockerfile和jar在同一个目录下,方便ADD。

22、dockerfile——案例——自定义centos

23、docker compose——概述

24、docker compose——安装使用

安装docker compose

# compose目前已经完全支持Linux、Mac Os和Windows,在我们安装Compose之前,需要先安装docker。下面我们以编译好的二进制包方式安装在Linux系统中。

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 设置文件可执行权限

chmod +x /usr/local/bin/docker-compose

# 查看版本信息

docker-compose -version

卸载docker-compose

rm  /usr/local/bin/docker-compose

使用docker compose编排nginx+springboot

  • 1、创建docker-compose目录

mkdir  ~/docker-compose

cd ~/docker-compose

  • 2、编写docker-compose.yml
version: '3'
services:
  nginx:
    image: nginx
    ports:
    - 80:80
    links:
    - app
    volumes:
    - /root/nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
  • 3、创建 /root/nginx/conf.d 目录

mkdir -p  /root/nginx/conf.d

  • 4、在conf.d目录下编写nginx.conf文件
server {
    listen 80;
    access_log off;
    
    location / {
        proxy_pass http://app:8080;
    }
}
  • 5、在  /root/docker-compose目录下使用docker-compose 启动容器

docker-compose up -d 

  • 6、验证

25、docker私有仓库——搭建

# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、验证:打开浏览器,输入地址 http://私服仓库IP:5000/v2/_catalog,看到{"repositries":[]}表示私服搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步骤用于让docker信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有服务器真实ip,daemon是个json格式的文件,如果已经有配置(比如之前的镜像配置),只需要加个逗号,将下面大括号里面的内容追加到逗号后面即可。
{  "insecure-registries":["192.168.31.101:5000"]  }
# 5、重启docker服务
systemctl restart docker
docker start registry

26、docker私有仓库——上传镜像

# 1、标记镜像为私有仓库的镜像: docker tag 镜像名:版本 新的名字:版本。由于需要push,新的镜像名要带着仓库信息,不打算push,这个名字可以随意起
docker tag centos:7 私有仓库服务器IP:5000/centos:7 
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7 

验证:

27、docker私有仓库——拉取镜像

docker images 查看本地镜像,删除掉tag镜像。

然后拉取 docker pull  192.168.31.101:5000/centos:7 

然后再次docker images看下是否拉取成功。

注意:我们看到下载时提示并没有下载,而是使用旧的已删除的做的恢复。这个不影响我们实验。

28、docker和虚拟机比较

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

济南大飞哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值