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
启动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
列出本地主机上的镜像: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)
启动弹出终端交互: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/名称
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
cat xxx.tar | docker import -镜像用户/镜像名:镜像版本号
提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
案列:安装vim命令
apt-get update
apt-get -y install vim
docker commit -m=“add vim cmd” -a=“zzq” bc19cba81c49 redis-vim:1.0
下载镜像docker registry
docker pull registry
运行私有库registry,相当于本地有个私有docker hub
docker run -d -p 5000:5000 -v docker存储目录:/tmp/registry --privileged=true registry
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
将新镜像修改符合私服规范的tag
docker tag 镜像:tag Host:Port/Repository:Tag
如下: docker tag redis-ifconfig:1.1 172.16.64.21:5000/redis-ifconfig:1.1
重启docker
systemctl restart docker
push推送到私服库
docker push 172.16.64.21:5000/redis-ifconfig:1.1
从私服pull到本地并运行
docker pull 172.16.64.21:5000/redis-ifconfig:1.1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内的目录 镜像名
docker run -it -- privileged=true -v /zzq/dockerRegistry:/tmp/docker_data --name=test 172.16.64.21:5000/redis-ifconfig:1.1
docker inspect 容器id
如果限制容器
/容器目录:ro 镜像名 就能完成功能,此时容器自己智能读取不能写
ro=read only 但不限制宿主机
如果继承容器
docker run -it --privileged=true --volumes-from 父类 --name=xxx 镜像名称
以下是Docker的好处:
1. 轻量级:Docker的运行环境非常轻量级,可以在几秒钟内启动一个容器。
2. 简化配置和部署:Docker的容器镜像可以包含应用程序和所有依赖的库,运行时无需安装或配置任何东西。
3. 可移植性:Docker容器可以在任何支持Docker的操作系统上运行,包括Windows,Linux和MacOS等。
4. 隔离性:Docker容器提供了虚拟化的隔离性,可以确保在同一主机上运行的不同应用程序之间互相隔离和安全。
5. 可伸缩性:使用Docker可以轻松地扩展应用程序容量。
6. 低成本:使用Docker可以减少虚拟机数量,从而减少硬件成本和管理它们的复杂性。
7. 开放性:Docker是一个开源项目,由社区维护和更新,可以免费获得。
总体步骤
docker search 镜像名
docker pull 镜像名
docker images 镜像名
docker run -it -d -p port:port 镜像名
docker stop 镜像名
docker rmi -f 镜像名
常规软件安装
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8
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
同样的上述还是存在数据安全问题,只要和数据相关的容器都需要设置数据卷安全备份
在宿主机上建目录
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 pull nginx:1.9.9
docker run -d -p 80:80 --name=nginx nginx:1.9.9