Docker容器化技术

Posted by kzdgt on Saturday, June 25, 2022

这个博客非常好,里面有docker相关的内容 docker - 洛溪 (zhpengfei.com)

安装docker

使用官方安装脚本自动安装

安装命令如下:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

安装完成后,如果允许docker命令,如docker ps,若出现报错

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

如果是CentOS或者Ubuntu您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

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

docker命令

docker服务相关命令

启动 Docker服务

systemctl start docker

停止docker服务

systemctl stop docker

查看docker服务状态

systemctl status docker

重启docker服务

systemctl restart docker

设置开机启动docker服务

systemctl enable docker

docker镜像相关命令

查看镜像

docker images
docker images -q #查看所有镜像Id

搜索镜像

docker search xx

下载镜像

docker pull xx
docker pull xx:版本号

删除镜像

docker rmi xx:版本号

docker容器相关命令

docker容器相关命令

docker容器相关命令1

查看容器

docker ps  # 查看正在运行的容器
docker ps -a  # 查看所有容器,关闭和没关闭的都可以看到
docker ps -aq  #查看所有容器id

创建容器

docker run -it --name=c1 centos:7 /bin/bash
docker run -id --name=c2 centos:7
  • -i: 交互式操作,没有连接也一直运行

  • -t: 给容器分配终端。

  • -d:后台运行容器

  • –name:容器名字

  • ubuntu: ubuntu 镜像。

  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash,不加默认/bin/bash。

进入容器

docker exec -it c2 /bin/bash

停止容器

docker stop c2

启动容器

docker start c2

查看容器信息

docker inspect c2

删除容器

docker stop c2
docker rm c2
docker rm `docker ps -aq`

docker容器的数据卷

数据卷概念

数据卷的概念0

配置数据卷

配置数据卷

数据卷容器

解决的场景

数据卷容器

配置数据卷容器

注意:即使挂载的同一个数据卷容器c3挂了,c1和c2的数据交换不受影响;如果c1、c2数据变化了,c3后面起来了,c3的数据和c1、c2一样。

数据卷小结

数据卷小结

数据卷实质就是宿主机的一个目录或文件,这个目录或文件得跟容器的一个目录或文件通过-v参数来进行映射

容器数据持久化:容器里面的数据产生了,如果容器出现问题,将来数据不能再恢复了,绑定数据卷之后,数据将在数据卷中持久化的存在,容器和数据卷的生命周期就相互隔离

docker应用部署

MySQL部署

mysql部署可以参数《各服务部署docker》-MySql部分

MySQL部署

mkdir mysql

cd mysql

docker run -id \
 -p 3306:3306 \
 --name=c_mysql \
 -v $PWD/conf:/etc/mysql/conf.d \
 -v $PWD/logs:/logs \
 -v $PWD/data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=123456 \
 mysql:5.7
# 进入容器
docker exec -it c_mysql /bin/bash 
# 使用MySQL
mysql -uroot -p 

Tomcat部署

Tomcat部署

Nginx部署

Nginx部署

mkdir nginx
cd nginx
mkdir conf
cd conf
vim 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;
    #    }
    #}

}
docker run -id \
--name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/user/share/nginx/html \
nginx

Redis部署

Nginx部署

dockerfile

docker镜像原理

Docker镜像原理

Docker镜像原理1

Docker镜像原理2

Docker镜像原理3

镜像制作

容器转为镜像

可写容器改变后制作成新的镜像,新的镜像包含了容器的部分改变,不是全部改变。不是目录挂载的都可以生效,目录挂载的不生效。也就是说创建目录、文件会生效,但是数据卷不会生效。

容器转为镜像

dockerfile创建镜像

DockerFile概念

制作自定义centos

需求:

  1. 默认登录路径为/user
  2. 可以使用vim

实现步骤:

  1. 定义父镜像:FROM centos:7
  2. 定义作者信息:MAINTAINER qdf <2210828779@qq.com>
  3. 执行安装vim命令:RUN yum install -y vim
  4. 定义默认的工作目录:WORKDIR /user
  5. 定义容器启动执行命令:CMD /bin/bash

dockerfile内容:

FROM centos:7
MAINTAINER qdf <2210828779@qq.com>
RUN yum install -y vim
WORKDIR /user
CMD /bin/bash

创建镜像:

docker build -f ./centos_dockerfile -t qdf_centos:1 .  # 在dockerfile同目录

服务编排

服务编排

docker compose

Docker Compose

docker-compose.yml示例:

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

使用docker-compose来部署开发环境

docker-compose的作用

docker-comopse可以帮助我们快速搭建起开发环境,比如你可以去把redis,mongodb,rabbitmq,mysql,eureka,configserver等一次部署在本机,然后让它们做为其它项目的基础,这是可以实现的。

由于每个docker实例都是一个封闭的环境,所以默认情况下它们是不能共享的,即你的rabbit容器不能连接你的redis容器,你的configserver不能连接你的eureka容器,如果希望让它们之间进行数据通讯,需要设置links属性来实现,而在本机(宿主机)上进行连接时,使用localhost和端口是可以访问这些容器的,这个我们要清楚。

启动顺序-depends_on

而对于启动顺序来说,比如你的configserver依赖于eureka,希望先启动被依赖的容器,再运行自己,这时我们可以使用depends_on属性来实现,当然它也只是启动顺序,不能保证服务真的越来后再去启动另一个,解决的方法是使用失败重试机制restart: on-failure,当configserver失败后,你可以重启,直到成功为止(主是直到eureka启动越来为止)。

容器与容器之间要用服务名通讯

如果我们的具体项目也希望部署到docker-compose里,希望去访问其它的服务,这时,需要使用docker-compose里定义的服务名称,而不是localhost,因为当你的容器起来之后,它的localhost是自己的容器,而不是宿主机,反之在宿主机上,如果希望访问容器,可以使用localhost,这一点在前文中已经提到。

下面是我写的一个部署开发环境的例子

version: "3.3"
services:
 
  # 公用组件相关配置
  mongodb:
    image: mongo:3.4.10
    ports:
      - "27017:27017"
    networks:
      - dev
    volumes:
      - mongo_data:/data/db
 
  redis:
    image: redis:3.2-alpine
    networks:
      - dev
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
 
  rabbit:
    image: rabbitmq:3.6.10-management-alpine
    hostname: rabbit
    ports:
      - "5672:5672"
      - "15672:15672"
      - "61613:61613"
    networks:
      - dev
    environment:
      RABBITMQ_DEFAULT_VHOST: pilipa
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq
  
  eurekaserver:
    build: ./springcloud/eureka-server
    restart: on-failure
    ports:
      - "8761:8761"
      - "8762:8762"
    networks:
      - dev
 
  configserver:
      build: ./springcloud/config-server
      restart: on-failure
      ports:
        - "8888:8888"
        - "8889:8889"
      networks:
        - dev
      depends_on:
        - eurekaserver #依赖服务
      links:
        - eurekaserver
      environment:
        SPRING_PROFILES_ACTIVE: devops
      volumes:
        - /Users/lind.zhang/project/config-repo:/config_repo #前面是本地路径,后而是容器里的路径,在configserver里配置的是后面的容器路径

启动与更新

  1. 先打镜像
docker-compose build
  1. 再启动服务
docker-compose up -d #-d是后台运行
  1. 停止服务
docker-compose down
  1. 查看容器的日志
docker logs -f 容器ID

docker私有仓库

搭建私有仓库

# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://ip:5000/v2/_catalog,看到{"repositories":[]}表示私有仓库搭建成功
# 4、修改daemon.json
vim /etc/docker/deamon.json
# 5、在文件中添加以下内容,保存退出。此步用于让docker信任私有仓库地址
{"insecure-registries":[ip:5000]}
# 6、重启docker服务
systemctl restart docker
docker start registry

上传镜像

# 1、标记镜像设置为私有仓库镜像
docker tag centos:7 IP:5000/centos
# 2、上传标记的镜像
docker push IP:5000/centos:7
# 3、下载镜像时
docker pull IP:5000/镜像
# 4、删除下载的镜像时
docker rmi IP:5000/镜像

容器、虚拟机比较

容器虚拟机比较0

容器虚拟机比较1

「真诚赞赏,手留余香」

kzdgt Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付