Centos 8.1安装Docker
下载docker-ce.repo
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
安装依赖
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
安装docker-ce
yum install docker-ce -y
启动docker
systemctl start docker
阿里云镜像加速器配置
阿里云镜像加速器地址 https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
- vim /etc/docker/daemon.json
- { “registry-mirrors”: [“https://xxxx.mirror.aliyuncs.com”] }
- systemctl daemon-reload
- systemctl restart docker
最后使用docker info命令查看镜像加速器是否生效
命令
帮助命令
docker --help
docker info
docker version
镜像命令
docker images 列出本地主机上的镜像
-a 列出本地所有的镜像(含中间映像层)
-q 只显示镜像ID
--digests 显示镜像的摘要信息
--no-trunc 显示完整的镜像信息
docker search 在hub上查找有哪些镜像
docker search -s 300 tomcat 收藏数超过300的tomcat镜像
--no-trunc 显示完整的镜像信息
docker pull tomcat == docker pull tomcat:latest 下载镜像
docker rmi hello-world 删除hello-world镜像
docker rmi -f hello-world 强制删除hello-world镜像
docker rmi -f nginx hello-world 删除多个
docker rmi -f $(docker images -q) 删除所有
docker history hzy/centos:2.0 列出镜像变更历史
docker如何导入导出镜像
导出
docker save 镜像id >/mydocker/tomcat.tar
导入
docker load < tomcat.tar
修改镜像名称和标签名称
docker tag 镜像id tomcat:8
容器命令
docker run -it imageid 启动交互式容器 (image id 使用docker images查看)
--name 为容器指定一个名称
-d 后台运行容器,并返回容器ID
-i 以交互式模式运行容器
-t 为容器重新分配一个伪输入终端
-P 随机端口映射
-p 指定端口映射
docker run -d centos /bin/sh -c “while true;do echo hello centos;sleep 5;done” 带脚本的后台运行容器
docker run -d -p:3306:8080 hzy/tomcat:1.0 不带脚本的后台运行容器
docker run -it -p:8080:8080 tomcat 指定外部端口和容器端口
docker run -it -P tomcat 随机端口映射
docker ps 查看运行的
-l 上次运行的容器
-a 列出当前所有正在运行的容器+历史上运行的
-n 显示最近n个创建的容器 如:-n 5
-q 静默模式,只显示容器编号
--no-trunc 不截断输出
exit 容器停止退出
ctrl+P+Q 容器不停止退出
docker start 容器id 启动容器 (容器id CONTAINER ID ,可以使用docker ps查看)
docker restart 容器id 重启容器
docker stop 容器id 停止容器
docker kill 容器id 强制停止容器
docker rm 容器id 删除已经停止的容器
-f 先停止在删除
docker rm -f $(docker ps -qa) 删除所有容器
docker logs 容器id 查看容器日志
-t 加入时间戳
-f 跟随最新日志打印
--tail 显示最后多少条
docker top 容器id 查看容器内运行的进程
docker inspect 容器id 查看容器内部细节
docker attach 容器id 直接进入容器启动命令的终端,不会启动新的进程
docker exec 容器id ls -l /root 在容器外宿主机操作容器
docker exec -it 容器id /bin/bash 进入容器
docker cp 容器id:容器文件地址 宿主机地址 复制容器内的文件到宿主机上
docker commit -a=“作者” -m=“提交的描述信息” 容器id 要创建的目标镜像名:标签名
docker commit -a=“hzy” -m=“tomcat9” 容器id hzy/tomcat 提交
数据卷
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
docker run -it -v 宿主机绝对路径目录:容器内目录:ro 镜像名 ro只读,容器只能读文件
编写Dockerfile制作容器卷
第一步:
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","dataVolumeContainer2"]
CMD echo "finished,-----------success"
CMD /bin/bash
第二步:
执行build -f 参数才是用来指定 Dockerfile 的路径的
docker build 最后的 . 号 指定镜像构建过程中的上下文环境的目录
docker build -f Dockerfile目录 -t 镜像名称 .
docker build -f /mydocker/Dockerfile -t centos .
第三步:docker run 新的镜像名称
使用 docker inspect 指令来查看数据卷中容器的目录地址对应宿主机的地址
docker inspect 容器id
数据卷容器
启动01
docker run -it --name 01 hzy/centos:1.0
启动02 并继承 01(使用继承 父子可以共享文件,各自添加都可以共享。及时父容器被删除,子容器与子容器之间依旧可以共享)
docker run -it --name 02 --volumes-from 01 hzy/centos:1.0
DockerFile
保留字指令
FROM 基础镜像,当前镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定在创建容器后,终端默认登录的进来的工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝到镜像且自动处理URL和解压tar压缩包
COPY 类似ADD 拷贝文件和目录到镜像中
VOLUME 容器数据卷,用于数据保存持久化工作
CMD 指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后参数替换
ENTRYPOINT 和CMD一样,不同点:,CMD不会被docker run之后参数替换,会追加
ONBUILD 当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
制作centos的DockerFile并构建镜像
编写DockerFile文件并命令为DockerfileCentos
FROM centos
MAINTAINER hzy<hu_ziyang@foxmail.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "------success------"
CMD /bin/bash
执行build构建新的镜像
docker build -f /mydocker/DockerfileCentos -t hzy/centos:2.0 .
制作tomcat的DockerFile并构建镜像
编写DockerFile文件并命令为Dockerfile
FROM centos
MAINTAINER hzy<hu_ziyang@foxmail.com>
COPY c.txt /usr/local/copy.txt
ADD jdk-8u231-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.59.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_231
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.59
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.59
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.59/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.59/bin/logs/catalina.out
执行build构建新的镜像
docker build -t hzy/tomcat8:1.0 .
执行run(添加两个容器卷 --privileged=true 权限问题)
docker run -d -p 8080:8080 --name tomcat8 -v /mydocker/tomcat/test:/usr/local/apache-tomcat-8.5.59/webapps/test
-v /mydocker/tomcat/tomcat8logs/:/usr/local/apache-tomcat-8.5.59/logs
--privileged=true
hzy/tomcat8:1.0
常用安装
mysql5.7安装
拉镜像
docker pull mysql:5.7
执行
docker run -p 3306:3306 --name mysql -v /mydocker/mysql5.7/conf:/etc/mysql/conf.d -v /mydocker/mysql5.7/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=19981101 -d d821b79a874a
启动成功,进入mysql容器
docker exec -it mysql容器id /bin/bash
进入mysql容器,登录mysql
mysql -uroot -p
在宿主机上备份mysql所有数据库
docker exec mysql容器id sh -c 'exec mysqldump --all-databases -uroot -p"123456"' >/mydocker/mysql5.7/all-databases.sql
redis3.2安装
拉镜像
docker pull redis:3.2
执行
docker run -p 6379:6379 -v /mydocker/redis3.2/data:/data -v /mydocker/redis3.2/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
编写redis配置文件
vim /mydocker/redis3.2/conf/redis.conf/redis.conf
# Redis配置文件样例
# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
daemonize no
# 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6379
# 绑定的主机地址
# 你可以绑定单一接口,如果没有绑定,所有接口都会监听到来的连接
# bind 127.0.0.1
# 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 0
# 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
# 日志记录方式,默认为标准输出,如果配置为redis为守护进程方式运行,而这里又配置为标准输出,则日志将会发送给/dev/null
logfile stdout
# 设置数据库的数量,默认数据库为0,可以使用select <dbid>命令在连接上指定数据库id
# dbid是从0到‘databases’-1的数目
databases 16
################################ SNAPSHOTTING #################################
# 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# 满足以下条件将会同步数据:
# 900秒(15分钟)内有1个更改
# 300秒(5分钟)内有10个更改
# 60秒内有10000个更改
# Note: 可以把所有“save”行注释掉,这样就取消同步操作了
save 900 1
save 300 10
save 60 10000
# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
# 工作目录.
# 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
#
# Also the Append Only File will be created inside this directory.
#
# 注意,这里只能指定一个目录,不能指定文件名
dir ./
slave-serve-stale-data yes
# 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
# 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
# IMPORTANT: Check the BGREWRITEAOF to check how to rewrite the append
# log file in background when it gets too big.
appendonly no
# 指定更新日志文件名,默认为appendonly.aof
# appendfilename appendonly.aof
# The fsync() call tells the Operating System to actually write data on disk
# instead to wait for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
# 指定更新日志条件,共有3个可选值:
# no:表示等操作系统进行数据缓存同步到磁盘(快)
# always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
# everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
slowlog-log-slower-than 10000
slowlog-max-len 1024
# 指定是否启用虚拟内存机制,默认值为no,
# VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中
# 把vm-enabled设置为yes,根据需要设置好接下来的三个VM参数,就可以启动VM了
vm-enabled no
# vm-enabled yes
# Redis交换文件最好的存储是SSD(固态硬盘)
# 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
# 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多少,所有索引数据都是内存存储的(Redis的索引数据就是keys)
# 也就是说当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
# Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的数据大小来设定的。
# 建议如果存储很多小对象,page大小最后设置为32或64bytes;如果存储很大的对象,则可以使用更大的page,如果不确定,就使用默认值
vm-page-size 32
# 设置swap文件中的page数量由于页表(一种表示页面空闲或使用的bitmap)是存放在内存中的,在磁盘上每8个pages将消耗1byte的内存
# swap空间总容量为 vm-page-size * vm-pages
#
vm-pages 134217728
# 设置访问swap文件的I/O线程数,最后不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟,默认值为4
vm-max-threads 4
# 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 指定是否激活重置哈希,默认为开启
activerehashing yes
# 指定包含其他的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各实例又拥有自己的特定配置文件
# include /path/to/local.conf
# include /path/to/other.conf
在宿主机上连接redis
docker exec -it redis容器id redis-cli
镜像推送阿里云
制作镜像
docker commit -a="hzy" -m="redis3.2" 容器id hzy/redis:3.2.1
-
在阿里云容器镜像服务中创建镜像仓库
-
docker login --username=199****5067 registry.cn-hangzhou.aliyuncs.com
-
docker tag 镜像id registry.cn-hangzhou.aliyuncs.com/huziyang/myredis:3.2.1 docker push registry.cn-hangzhou.aliyuncs.com/huziyang/myredis:3.2.1