docker基础

docker基础_第1张图片

1安装

yum install gcc
yum -y install gcc- c++
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
配置个人阿里云镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://6hrz0v2a.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker
docker run hello-world

2 常用命令

启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令  --help

3 镜像命令



列出本地主机上的镜像:docker images
查询某个镜像:docker search 镜像名称
拉取某个镜像到本地:docker pull 镜像名称:版本号
查看镜像/容器/数据卷占用的空间:docker system df 
删除某个镜像:docker   rmi -f 镜像id/镜像名称
删除多个镜像:docker   rmi -f a b c
删除全部:docker rmi -f $( docker images -qa)

4容器命令

启动弹出终端交互:docker run -it 【--name= xxx】服务名称 /bin/bash
列出当前所有正在运行的容器:docker ps 【option】
       -a:列出当前所有正在运行的容器+历史上运行过的
       -l:显示最近创建的容器
       -n:显示最近n个创建的容器
       -q:静默模式 ,只显示容器编号
列出所有运行过的容器id:docker ps -a -q
退出容器:
       exit:run进去容器,exit退出,容器停止
       ctrl+p+q :run进去容器,ctrl+p+q退出,容器不停止
      
启动已经停止的容器:
       docker start 容器id/容器名称
重启容器:docker restart 容器id/容器名称
停止容器:docker stop 容器id/容器名称
强制停止容器:docker kill 容器id/容器名称
删除已停止的容器:docker rm 容器id/名称
强制删除容器:docker rm -f 容器id/名称

5 重要

1 有镜像才能创建容器,这是根本前提
2 docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令就是会自动退出
3 从面向对象角度,docker利用容器container独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似一个虚拟化的运行环境,容器是用镜像创建的运行实例,就像是java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器为镜像提供一个标准的隔离的运行环境,它可以被启动/开始/停止/删除。每个容器都是相互隔离的,保证安全的平台
4 从镜像容器角度可以把容器看作是一个简易版的linux环境和运行在其中的应用程序

所以必须使用

  docker run -it 【--name= xxx】服务名称 /bin/bash

以redis6.0.8启动演示说明

前台交互式启动:docker run -it redis:6.0.8
后台守护式启动:docker run -d redis:6.0.8

 查看docker日志:docker logs 容器id/名称
 查看容器内运行的进程:docker top 容器id/名称
 查看容器内部细节:docker inspect 容器id/名称

进入正在运行的容器并以命令行交互:

docker exec -it 容器id /bin/bash
重新进入:docker attach 容器id

     *上述两者的区别:
           attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止。
           exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止。
    推荐大家使用:docker exec命令 ,因为退出容器终端,不会导致容器的停止。

从容器内拷贝文件到主机上:

docker cp 容器id:容器内路径 目的主机路径

  • 导入和导出容器:

    1 export导出容器的内容流作为一个tar归档文件【对应import命令】:

docker export 容器id > xxx.tar

  • 2 import从tar包中的内容创建一个新的文件系统再导入为镜像【对应export】:

cat xxx.tar | docker import -镜像用户/镜像名:镜像版本号

6 docker commit

docker基础_第2张图片

提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]

案列:安装vim命令

  • docker容器内执行下面两条命令
  apt-get update
  apt-get -y install vim

docker commit -m=“add vim cmd” -a=“zzq” bc19cba81c49 redis-vim:1.0

7 本地镜像发布阿里云

  1. 本地镜像发布到阿里云流程
    docker基础_第3张图片

  2. 镜像的生成方法

  3. 将本地镜像推送到阿里云
    docker基础_第4张图片

  4. 将阿里云上的镜像下载到本地
    docker基础_第5张图片

8 搭建本地私有库

  1. 下载镜像docker registry

    docker pull registry

  2. 运行私有库registry,相当于本地有个私有docker hub

    docker run -d -p 5000:5000 -v docker存储目录:/tmp/registry --privileged=true registry

  3. cur验证私服库上有仕么镜像
    3.1 安装ifconfig命令

    apt-get install net-tools

    3.2 发布到阿里云仓库

    docker commit -m=“ifconfig add cmd” -a=“zzq” 5f1f93fb85d4 redis-ifconfig:1.1

    3.3 验证私服curl

    curl -XGET http://172.16.64.21:5000/v2/_catalog

  4. 将新镜像修改符合私服规范的tag

    docker tag 镜像:tag Host:Port/Repository:Tag

     如下: docker tag redis-ifconfig:1.1 172.16.64.21:5000/redis-ifconfig:1.1
  1. 修改配置文件使之支持http

    vi /etc/docker/daemon.json

重启docker

systemctl restart docker

  1. push推送到私服库

    docker push 172.16.64.21:5000/redis-ifconfig:1.1

    docker基础_第6张图片

  2. curl验证私服库上有仕么镜像
    在这里插入图片描述

  3. 从私服pull到本地并运行

    docker pull 172.16.64.21:5000/redis-ifconfig:1.1

9 docker容器数据卷

docker基础_第7张图片

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录 镜像名

docker基础_第8张图片
案列:

 docker run -it -- privileged=true -v /zzq/dockerRegistry:/tmp/docker_data --name=test 172.16.64.21:5000/redis-ifconfig:1.1

在这里插入图片描述
docker基础_第9张图片
查看容器卷内部关系

docker inspect 容器id

docker基础_第10张图片
最终测试结论

  1. 主机修改,docker同步获得
  2. docker容器stop,主机修改,docker容器重启同步获得

如果限制容器

/容器目录:ro 镜像名 就能完成功能,此时容器自己智能读取不能写
ro=read only 但不限制宿主机

如果继承容器

docker run -it --privileged=true --volumes-from 父类 --name=xxx 镜像名称

10 docker常规安装简介

以下是Docker的好处:
 1. 轻量级:Docker的运行环境非常轻量级,可以在几秒钟内启动一个容器。
 2. 简化配置和部署:Docker的容器镜像可以包含应用程序和所有依赖的库,运行时无需安装或配置任何东西。
 3. 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,包括WindowsLinuxMacOS等。
 4. 隔离性:Docker容器提供了虚拟化的隔离性,可以确保在同一主机上运行的不同应用程序之间互相隔离和安全。
 5. 可伸缩性:使用Docker可以轻松地扩展应用程序容量。
 6. 低成本:使用Docker可以减少虚拟机数量,从而减少硬件成本和管理它们的复杂性。
 7. 开放性:Docker是一个开源项目,由社区维护和更新,可以免费获得。

总体步骤

  1. 搜索镜像

    docker search 镜像名

  2. 拉取镜像

    docker pull 镜像名

  3. 查看镜像

    docker images 镜像名

  4. 启动镜像

    docker run -it -d -p port:port 镜像名

  5. 停止容器

    docker stop 镜像名

  6. 移除容器

    docker rmi -f 镜像名

常规软件安装

  • tomcat安装

docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

  • mysql安装

docker pull mysql:5.7
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

  进入mysql容器

docker exec -it 容器id /bin/bash

 进入myql服务中,过程操作和非docker操作一样

mysql -uroot -p

mysql常见的问题 解决方案
解决中文乱码报错,默认不设置是拉丁文所以会乱码 SHOW VARIABLES LIKE ‘character%’
删除容器后,里面的mysql数据咋么办 一定要做数据卷的备份

数据/日志/配置和宿主机联合备份

docker run -d -p 3306:3306 --privileged=true -v /zzq/mysql/log:/var/log/mysql -v/zzq/mysql/data:/var/lib/mysql -v /zzq/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7

在上面的目录中在宿主机中新建配置文件同步到MySQL容器中

 cd /zzq/mysql/conf
 vim my.cnf
[client]
#设置客户端字符集
default_character_set=utf8
[mysqld]
#开启定时任务
event_scheduler=ON
#允许最大连接数	
max_connections=300
#最大等待时间单位s
wait_timeout = 28800
max_allowed_packet=500M
#服务端使用的字符集默认为8比特编码的latin1字符集
character_set_server=utf8
#设置服务端字符排序规则
collation_server=utf8_general_ci
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#开启查询缓存
explicit_defaults_for_timestamp=true
#skip-grant-tables
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#设置mysql连接数
max_connections=151
#设置不区分大小写
lower_case_table_names=1

改完配置后重启mysql

docker restart mysql
或者
docker run -d -p 3306:3306 --privileged=true -v /zzq/mysql/log:/var/log/mysql -v/zzq/mysql/data:/var/lib/mysql -v /zzq/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7
上面的前提是要删除mysql历史名称,不然会报错
docker ps -a
docker rm mysql历史名称容器id
  • redis安装

    拉取redis

    docker pull redis:6.0.8

    运行redis

    docker run -d -p6379:6379 redis:6.0.8

    进入到redis修改配置

    docker exec -it redis容器id /bin/bash

    同样的上述还是存在数据安全问题,只要和数据相关的容器都需要设置数据卷安全备份

    在宿主机上建目录

    mkdir /zzq/redis
    cd /zzq/redis
    vim redis.conf
    docker基础_第11张图片

    redis.confi配置后的全文件

protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
oom-score-adj no
oom-score-adj-values 0 200 800
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes


数据安全卷启动

docker run -p 6379:6379 --name=redis --privileged=true -v /zzq/redis/redis.conf:/etc/redis/redis.conf -v /zzq/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

上述命令起来没有报错,但是服务没有起来的解决方案

配置文件中,daemonize 默认为no,不需要修改为yes
因为改为yes表示以守护进程的方式启动redis,我们使用docker run启动命令的时候就不能使用-d了,因为-d这个参数也是表示以守护进程的方式启动redis容器,这两个配置会产生冲突,导致无法启动成功,也没有报错日志

docker基础_第12张图片

  • nginx安装

docker pull nginx:1.9.9
docker run -d -p 80:80 --name=nginx nginx:1.9.9

你可能感兴趣的:(docker,容器,运维)