Docker容器基础知识点总结

发布时间:2023年12月28日

一 、Docker架构

dockers加速镜像:

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

查看dockers容器有哪些镜像:

docker images
docker images -q  查看所有镜像的id

删除所有镜像  docker rmi `docker images -q`
删除镜像  docker rmi --force 镜像ID

搜索有哪些镜像

docker search imagename

下载镜像到dockers容器

docker pull imagename

从容器中删除某个镜像

docker rmi redis:5.0

查看官网: https://hub.docker.com

1. 容器相关命令
  • 查看容器

  • 创建容器

  • 进入容器

  • 启动容器

  • 停止容器

  • 删除容器

  • 查看容器信息

1.1 创建容器 docker run
docker images
-i 容器一直运行 -t 创建终端  -d 后台运行创建容器
1. 创建容器
方法一
docker run -it --name=lk centos:7 /bin/bash
注意 使用 -it参数创建的容器 创建完成立即进入容器,exit就会立马关闭容器
方法二
docker run -id --name=lk1 centos:7
2. 查看容器
docker ps -a
注意 使用 -id参数创建的容器 创建完成不会立即进入容器,exit也不会关闭容器还是后台运行

-it创建的容器一般称为交互式容器, -id创建的容器一般称其为守护式容器
3. 进入容器
docker exec -it lk /bin/bash
4. 停止容器
docker stop lk
5. 启动容器
docker start lk

6. 删除容器
docker rm lk
7. 删除所有容器
docker rm `docker ps -aq`  但是开启状态的容器是不能被删除的
8. 查看容器的信息
docker inspect lk
2. docker容器的数据卷
2.1 数据卷的概念与作用

思考:

  • docker容器删除后,容器中产生的数据还在吗?
  • docker容器和外部机器可以直接交换文件吗?
  • docker容器之间想要进行数据交互

通过上面三个问题引入了:

容器的数据卷
在这里插入图片描述

  • 数据卷是宿主机中的一个文件和目录

  • 当容器目录和数据卷目录绑定后,双方的修改会立即同步

  • 一个数据卷可以被多个容器同时挂载

  • 一个容器也可以被挂载多个数据卷

数据卷的作用:

  • 容器数据持久化
  • 外部机器和容器间接通信
  • 容器之间数据交换
2.2配置数据卷
  • 创建启动容器时,使用 -v 参数 设置数据卷

    docker run ... -v 宿主机目录(文件):容器内目录
    
    注意事项:
    1. 目录必须是绝对路径
    2. 如果目录不存在, 会自动创建
    3. 可挂载多个数据卷
    
2.3 配置数据卷容器

多容器进行数据交换
在这里插入图片描述

  1. 多个容器挂载同一个数据卷
  2. 数据卷容器

至少需要三个容器

配置数据卷容器的方法

1. 创建启动c3数据卷容器,使用-v参数设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
2. 创建启动c1 ,c2容器,使用--volumes-from参数 设置数据卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash
3. docker应用部署
3.1 MySQL部署
  • 容器内的网络服务和外部机器不能直接通信.外部机器和宿主机可以直接通信
  • 宿主机和容器可以直接通信
  • 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务。
  • 这种操作称为:端口映射
    在这里插入图片描述

安装部署

1. 搜索MySQL镜像
docker search mysql
2. 拉去mysql镜像
docker pull mysql:5.6
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/mysql
cd mysql

docker run -id -p 3307: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.6
3.2 Tomcat 安装部署
1. 搜索tomcat镜像
docker search tomcat
2. 拉去tomcat镜像
docker pull tomcat
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/tomcat
cd tomcat

docker run -id -p 8090:8080 --name=c_tomcat \
-v $PWD:/usr/local/tomcat/webapp \
tomcat

4. 外部机器访问tomcat
192.168.31.20:8090
3.3 Nginx部署
1. 搜索Nginx镜像
docker search Nginx
2. 拉去Nginx镜像
docker pull Nginx
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/Nginx
cd Nginx
mkdir conf
cd conf
在~/nginx/conf目录下创建nginx.conf文件,
vim nginx.conf

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

4. 外部机器访问tomcat
192.168.31.20:80

nginx.conf的内容是

user administrator root;  #配置用户或者组,默认为nobody nobody。
worker_processes 2;  #允许生成的进程数,默认为1

pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log /var/log/nginx/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

events {
    #accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    #multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}

http {

    include       /etc/nginx/mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
	
    #access_log off; #取消服务日志  
	
	#自定义格式	
    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 /var/log/nginx/access.log main;  #combined为日志格式的默认值
	
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
	
	#tcp_nopush     on;
	
    #sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
	
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    #upstream mysvr {   
    #  server 127.0.0.1:7878;
    #  server 192.168.10.121:3333 backup;  #热备
    #}
    
    
	server {
        #keepalive_requests 120; #单连接请求上限次数。
		
        listen       80;   #监听端口
		
        server_name  127.0.0.1;   #监听地址       
		
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
			
			#root path;  #根目录
			#index vv.txt;  #设置默认页
			#proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
			#deny 127.0.0.1;  #拒绝的ip
			#allow 172.18.5.54; #允许的ip  
			root   /usr/share/nginx/html;
            index  index.html index.htm;
        } 
		
		error_page 404 /404.html; #错误页
	
		# 将服务器错误页重定向到静态页 /50x.html
		#
		error_page   500 502 503 504  /50x.html;
		location = /50x.html {
			root   /usr/share/nginx/html;
		}
    }
	
	include /etc/nginx/conf.d/*.conf;
}

3.4 Redis部署
1. 搜索Redis镜像
docker search Redis
2. 拉去tomcat镜像
docker pull Redis:5.0
3. 在宿主机下创建容器,设置端口映射、目录映射
mkdir ~/Redis
cd tomcat

docker run -id -p 6379:6379  --name=c_Redis \
Redis:5.0

4. 外部机器访问Redis
192.168.31.20:6379
3.5 gitlab部署

在/usr/local/docker/gitlab目录下创建一个docker-compose.yml文件

version: '3'
services:
    gitlab:
        image: 'twang2218/gitlab-ce-zh:9.4'
        restart: always
        hostname: '172.24.71.184'
        environment:
          TZ: 'Asia/Shanghai'
          GITLAB_OMNIBUS_CONFIG: |
              external_url 'http://172.24.71.184:8080'
              gitlab_rails['time_zone'] = 'Asia/Shanghai'
              gitlab_rails['gitlab_shell_ssh_port'] = 2222
              unicorn['port'] = 8888
              nginx['listen_port'] = 8080
        ports:
          - '8080:8080'
          - '8443:443'
          - '2222:22'
        volumes:
          - /usr/local/docker/gitlab/config:/etc/gitlab
          - /usr/local/docker/gitlab/data:/var/opt/gitlab
          - /usr/local/docker/gitlab/logs:/var/log/gitlab

      
      
version: '3'
networks:
    my_net:
        driver: bridge 
        ipam:
            config:
                - subnet: 172.30.0.1/24
services:
  gitlab:
    image:  'gitlab/gitlab-ce:14.9.5-ce.0'
    container_name: gitlab
    hostname: 'gitlab.example.com'
    restart: always
    environment:
      TZ: 'Asia/Shanghai'
      GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://172.24.71.184:8080'
          gitlab_rails['time_zone'] = 'Asia/Shanghai'
          gitlab_rails['gitlab_shell_ssh_port'] = 2222
          unicorn['port'] = 8888
          nginx['listen_port'] = 8080
          # 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
          # 电子邮件配置:
          gitlab_rails['smtp_enable'] = true
          gitlab_rails['smtp_address'] = "smtp.qq.com"
          gitlab_rails['smtp_port'] = 465
          gitlab_rails['smtp_user_name'] = "xxxxxxx@qq.com"
          gitlab_rails['smtp_password'] = "授权码,不是密码"
          gitlab_rails['smtp_authentication'] = "login"
          gitlab_rails['smtp_enable_starttls_auto'] = true
          gitlab_rails['smtp_tls'] = true
          # 这里的邮箱账号和上面保持一致
          gitlab_rails['gitlab_email_from'] = '528746460@qq.com'
          user['git_user_email']="528746460@qq.com"
          
          # 配置外部redis
          redis['enable']=false
          gitlab_rails['redis_host']="127.0.0.1"
          gitlab_rails['redis_port']=6379
          gitlab_rails['redis_password']='password'
          gitlab_rails['redis_database']=10
          #配置外部postgresql
          postgresql['enable'] = false
          gitlab_rails['db_adapter'] = 'postgresql'
          gitlab_rails['db_encoding'] = 'utf8'
          gitlab_rails['db_host'] = '127.0.0.1'
          gitlab_rails['db_port'] = '5432'
          gitlab_rails['db_username'] = 'postgres'
          gitlab_rails['db_password'] = 'postgres'
          gitlab_rails['db_database'] = "postgres"
    ports:
      - '8080:8080'
      - '8443:443'
      - '2222:22'
    volumes:
      - /usr/local/docker/gitlab/config:/etc/gitlab
      - /usr/local/docker/gitlab/data:/var/opt/gitlab
      - /usr/local/docker/gitlab/logs:/var/log/gitlab
      #- /home/ecs-user/docker/gitlab/public:/opt/gitlab/embedded/service/gitlab-rails/public
    shm_size: '256m'
    logging: 
      driver: "json-file"
      options: 
        max-size: "2g"
        max-file: "2"
    networks:
        my_net:
            ipv4_address: 172.30.0.6

保存文件后执行下面命令

1. sudo docker-compose up -d
2. sudo docker ps
3. sudo docker logs -f 容器id
4. Dockerfile 制作镜像

如何将自己的项目给到别人,避免水土不服
操作系统组成部分:

  • 进程调度子系统
  • 进程通信子系统
  • 内存管理子系统
  • 设备管理子系统
  • 文件管理子系统
  • 网络通信子系统
  • 作业控制子系统

Linux 文件系统由 bootfs 和 rootfs 两部分组成

  • bootfs :包含 bootloader (引导加载程序)和 kernel (内核).
  • rootfs : root 文件系统,包含的就是典型 Linux 系统中的/ dev ,
    / proc ,/ bin ,/ etc 等标准目录和文件
  • 不同的 linux 发行版, bootfs 基本一样,而 rootfs 不同,如 ubuntu、centos 等
4.1 Docker 镜像原理
  • docker 镜像是由特殊的文件系统叠加而成的
  • 最低端是bootfs,并使用宿主机的bootfs 复用宿主机的bootfs
  • 第二层root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统( Union File System )技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的境像成为基心镜像。
  • 当从一个镜像启动容器时, Docker 会在最顶层加载一个读写文件系统作为容器

在这里插入图片描述

思考:

1.Docker镜像本质是什么? 复用

  • 是一个分层文件系统

2.Docker 中一个 centos 镜像为什么只有200MB,而一个 centos 操作系统的 iso 文件要几个个 G ?

  • Centos 的 iso 镜像文件包含 bootfs 和 rootfs ,而 docker 的 centos 镜像复用操作系统的 bootfs ,只有 rootfs 和其他晚像层

3.Docker中一个 tomcat 境像为什么有500MB,而一个 tomcat 安装包只有70多 MB ?.

  • 由于 docker 中镜像是分层的, tomcat 虽然只有70多 MB ,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的 tomcat 镜像大小500多 MB
4.2 镜像制作
  1. 容器转为镜像

? docker commit 容器id 镜像名称:版本号

注意对于 有挂载的一些文件 使用docker commit 是不会转为镜像的

  1. 镜像文件转为压缩包传给别人使用
    下面二选一:
    1.docker save 镜像名字:版本号 > 要打包的名字.tar
    docker save 镜像名字:版本号 > 要打包的名字.tgz

    2.docker save -o 要打包名字.tar 镜像名字:版本号

  2. 压缩文件还原成镜像
    下面二选一:
    1.docker load -i 压缩文件名称
    2.docker load < 已打包的镜像名字.tar/tgz

4.3 dockerfile实现镜像步骤

案例一:

  • 定义父镜像: FROM java :8
  • 定义作者信息: MAINTAINER itheima itheima@itcast.cn
  • 将 jar 包添加到容器: ADD springboot.jar app.jar
  • 定义容器启动执行的命令: CMD java -jar app . jar

执行dockerfile文件

在对应目录下将你的项目jar包发给对应的人员

在创建一个dockerfile

通过 dockerfile 构建镜像: docker bulid - f dockerfile 文件路径﹣ t 镜像名称版本

docker bulid -f ./dockerfile_1 -t websapp .

案例二:

案例:实现步骤

  • 定义父镜像: FROM centos :7
  • 定义作者信息: MAINTAINER itheima itheima@itcast.cn
  • 执行安装 vim 命令: RUN yum install - y vim
  • 定义默认的工作目录: WORKDIR / usr
  • 定义容器启动执行的命令: CMD / bin / bash

使用dockerfile文件创建镜像,执行下面命令

docker bulid -f ./dockerfile_1 -t centos_hsh:1.0.2 .

5. docker compose

是一个编排容器分布式部署的工具

  1. 利用dockerfile定义运行环境镜像
  2. 使用docker-compose.xml定义组成应用的各服务
  3. 运行docker-compose up 启动应用
6. 私有仓库

docker pull registry

id - f dockerfile 文件路径﹣ t 镜像名称版本

docker bulid -f ./dockerfile_1 -t websapp .

案例二:

案例:实现步骤

  • 定义父镜像: FROM centos :7
  • 定义作者信息: MAINTAINER itheima itheima@itcast.cn
  • 执行安装 vim 命令: RUN yum install - y vim
  • 定义默认的工作目录: WORKDIR / usr
  • 定义容器启动执行的命令: CMD / bin / bash

使用dockerfile文件创建镜像,执行下面命令

docker bulid -f ./dockerfile_1 -t centos_hsh:1.0.2 .

5. docker compose

是一个编排容器分布式部署的工具

  1. 利用dockerfile定义运行环境镜像
  2. 使用docker-compose.xml定义组成应用的各服务
  3. 运行docker-compose up 启动应用
6. 私有仓库

docker pull registry

文章来源:https://blog.csdn.net/qq_42746084/article/details/135242315
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。