Docker入门篇,常用命令以及DockerFile

一、mac安装docker

1.先检查有无安装docker
docker info
2.使用brew安装,耐心等待下载完成
brew cask install docker
3.在应用程序中找到docker图标,点击运行
4.查看docker信息
docker info
5.检查Docker Engine,Docker Compose和Docker Machine的版本
docker --version
docker-compose --version
docker-machine --version

如果你的docker,docker-compose和docker-machine是能与Docker.app兼容的最新版本,那么你就可以运行下面这些命令。

二、配置镜像加速器

1、打开docker配置,点击Preferences
2、点击Daemon选项卡,在Registry mirrors下方点击+号,输入镜像地址(在https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors中找),输入好后点击下方的Apply & Restart按钮,耐心等待重启。

三、安装mysql

去docker hub找到自己要的mysql版本,docker pull安装
docker pull mysql:8.0   //安装mysql
docker images   //查看docker中的镜像列表
启动mysql镜像
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Awert159 -d 9b51d9275906
  • docker run:运行docker容器命令
  • –name mysql :给容器设置别名
  • -p 3306:3306:将容器的3306端口映射到宿主机的3306端口
  • -e MYSQL_ROOT_PASSWORD=你的密码 : 初始化root用户登录密码
  • -d : 后台运行容器,并返回容器id
  • mysql:8.0.18:也可以使用镜像id,就是image ID
查看运行的容器
docker ps
进入mysql容器
docker exec -it mysql bash
登陆mysql,先进入mysql容器
mysql -uroot -pAwert159
查看日志
docker logs mysql
  • 使用本地的mysql配置创建mysql镜像
docker run --name some-mysql -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0

在本地的/conf/mysql配置文件会合并到docker的/etc/mysql/conf.d

  • 不用配置文件,设置编码属性等
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

安装redis

安装redis镜像
docker pull redis
运行redis
docker run -d --name redis -p 6379:6379 redis:latest redis-server --appendonly yes --requirepass "你的密码"

参数说明:

docker run -d :后台运行

–name redis:服务名

-p 6379:6379 : 将容器6379端口映射到主机6379端口

redis-server --appendonly yes:在容器执行redis-server启动命令,并打开redis持久化配置

–requirepass “你的密码” :设置密码

用RDM连接

docker基本命令

一、基本命令
docker version  查看docker版本
docker info     查看docker详细信息
docker --help   查看docker命令
二、镜像命令
docker images       查看docker镜像
docker images -a    列出本地所有的镜像
docker images -p    只显示镜像ID
docker images --digests     显示镜像的摘要信息
docker images --no-trunc    显示完整的镜像信息
docker search tomcat        从Docker Hub上查找tomcat镜像
docker pull tomcat从Docker  Hub上下载tomcat镜像
docker rmi hello-world      从Docker中删除hello-world镜像
docker rmi -f hello-world   从Docker中强制删除hello-world镜像
docker rmi -f hello-world nginx       从Docker中强制删除hello-world镜像和nginx镜像
docker rmi -f $(docker images -p)     通过docker images -p查询到的镜像ID来删除所有镜像
三、容器命令。
docker run [OPTIONS] IMAGE根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
OPTIONS说明:
 --name=“容器新名字”:为容器指定一个名称
 -d:后台运行容器,并返回容器ID,也即启动守护式容器
 -i:以交互模式运行容器,通常与-t同时使用
 -t:为容器重新分配一个伪输入终端,通常与-i同时使用
 -P:随机端口映射
docker ps列出当前所有正在运行的容器
docker ps -a列出所有的容器
docker ps -l列出最近创建的容器
docker ps -n 3列出最近创建的3个容器
docker ps -q只显示容器ID
docker ps --no-trunc显示当前所有正在运行的容器完整信息
exit退出并停止容器
Ctrl+p+q只退出容器,不停止容器
docker start    容器ID或容器名称启动容器
docker restart  容器ID或容器名称重新启动容器
docker stop     容器ID或容器名称停止容器
docker kill     容器ID或容器名称强制停止容器
docker rm       容器ID或容器名称删除容器
docker rm -f    容器ID或容器名称强制删除容器
docker rm -f $(docker ps -a -q)删除多个容器
docker logs -f -t --since --tail 容器ID或容器名称查看容器日志
如:docker logs -f -t --since=”2018-09-10” --tail=10 f9e29e8455a5
 -f : 查看实时日志
 -t : 查看日志产生的日期
 --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志
 --tail=10 : 查看最后的10条日志
 docker top     容器ID或容器名称查看容器内运行的进程
docker inspect  容器ID或容器名称查看容器内部细节
docker attach   容器ID进到容器内
 docker exec -it 9df70f9a0714(容器id) /bin/bash     容器ID进到容器内
 ctrl+p+q   退出不停止容器 
docker cp       容器ID:容器内的文件路径 宿主机路径从容器内拷贝文件到宿主机.
如:docker cp f9e29e8455a5:/tmp/yum.log /root
--volumes-from  集成挂载
docker commit提交镜像
docker commit -m="镜像描述信息" -a="作者"容器id 目标的镜像名:[TAG](版本号)

DockerFile

常见命令
1 FROM ---指定基础镜像
    基础镜像不存在会在Docker Hub上拉去
使用格式:   
FROM <镜像>:[tag]     
FROM <镜像>@digest[校验码] 
当前主机没有此镜像时,会自动去官网HUB下载
..............................................
2 MAINTANIER --提供Dockerfile 制作者提供本人信息
    [逐渐废弃]
LABLE --替代MAINTANIER 
具体使用:
LABLE maintainer="作者信息"
使用格式:
MAINTANIER "guowei <597599150@qq.com>"
.......................................................
3 COPY --把宿主机中的文件复制到镜像中去!
    文件要在Dockerfile工作目录
src 原文件
    --支持通配符
    --通常相对路径
dest 目标路径   
    --通常绝对路径
有空白字符隔开的字串需要用"",否则会被当做两个文件!
文件复制准则:
1 src必须是build上下文中的路径,不能是其父目录
2 如果src是目录,则其内部文件或子目录会被递归复制
   但src目录自身不会被复制
3 如果指定了多个src,或在src中使用了通配符,则dest必须是一个
  目录,且必须以/结尾
4 如果dest实现不存在,它将会被自动创建,这包括其父目录
..............................................................
4 ADD --类似COPY命令
支持URL路径----如果可以访问网络的话,会访问网络下载
到本地然后打包进镜像!
操作准则:
1 如果src为URL且dest不以/结尾,则src指定的文件将被下载并
直接被创建为dest;如果dest以/结尾,则文件名URL指定的文件
将被直接下载并保存为dest/filename
2 如果是压缩包会被解压,但通过URL路径获取到的tar文件不会被展开
3 如果src有多个,或其间接或直接使用了通配符,则dest必须是一个
以/结尾的目录路径,如果dest不以/结尾,则其被视为一个普通文件
src的内容将被直接写入到dest中!
...............................................................
5 WORKDIR --指定工作目录
每次只会影响这个指令后续的指令
ADD nginx-1.14.2.tar.gz /usr/local/src/ --不受影响
WORKDIR /usr/local/src/
ADD nginx-1.14.2.tar.gz ./ --受影响
.............................................................
6 VOLUME --卷
只能定义docker管理的卷:
VOLUME /data/mysql
运行的时候会随机在宿主机的目录下生成一个卷目录!
................................................................
7 EXPOSE 为容器打开指定要监听的端口以实现与外部通信
使用格式:
EXPOSE 80/tcp 23/udp
不加协议默认为tcp
使用-P选项可以暴露这里指定的端口!
但是宿主的关联至这个端口的端口是随机的!
..............................................................
8 ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于
其后的其它命令所调用
调用格式:
$A 或 ${A}
ENV <key> <value> 
ENV <key>=<value>
第一种格式中,key之后的所有内容均会被其视作<value>的组成部分
因此,一次只能设置一个变量!
第二种格式可用一次设置多个变量,每个变量为一个<key>=<value>
的键值对,如果<value>中包含空格,可以反斜线(\)进行转义
也可以通过对<value>加引号进行标识。另外,反斜线也可用于续航
定义多个变量时。建议使用第二种方式,以便在同一层中完成所有功能
具体用法:
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib/
ENV PATH $PATH:$JAVA_HOME/bin/
ENV A /web/html
COPY index.html ${A:-/web/html}
在docker run 中传递变量:
docker run -e [list] 传变量值
如果在dockerfile中赋值变量后也能在docker run中继续赋值
docker run --name b1 --rm -e A=xx [镜像ID]
不会影响docker build 的过程!
printenv --输出环境变量信息
..............................................................
9 RUN命令:
使用格式:
RUN <command>
RUN ["<executable>","<param1>","<param2>"]
第一种格式中 <command命令通常是一个shell命令 且以"/bin/sh -c">来运行它
这意味此进程在容器中的PID不能为1,不能接收Unix信号,因此,当使用docker stop命令
来停止容器时,此进程接收不到信号
第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面的
<paramN>为传递给命令的选项或参数,然而,此种格式指定的命令不会以"/bin/sh -c">来运行它
因此常见的shell操作如变量替换以及通配符替换将不会进行 不过如果要运行的命令依赖于
此shell特性的话,可以将其替换为下面的格式:
RUN ["/bin/bash","-c","<executable>","<param1>"]
........................................................................
10 CMD命令:运行于docker run中
语法有三种写法
1. CMD ["executable","param1","param2"] --启动为ID为1的进程
具体实例:
CMD ["/bin/sh","-c","/bin/httpd","-f","-h /web/html]
2. CMD ["param1","param2"]
3. CMD command param1 param2 --直接运营为shell的子进程
param*=执行参数
例如第二种:
CMD ["nginx"] 
docker run -it -p 8888:80 172.20.23.31/server1/nginx-base:v1 nginx
只能是双引号!
CMD ["param1","param2"] 
 --此种用法用于为ENTRYPOINT指令提供默认参数
可用于执行脚本:
添加脚本:
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
RUN chmod +x /apps/tomcat/bin/run_tomcat.sh
RUN chown -R tomcat:tomcat /apps /data/tomcat
CMD ["/apps/tomcat/bin/run_tomcat.sh"] -- 引用脚本!
..............................................................
11 ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独
的可执行程序
与CND不同的是,由这个指令启动的程序不会被docker run 命令行指定的参数所覆盖
而且,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
使用格式:
ENTRYPOINT <command>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run 命令传入的命令参数会覆盖CMD指定的内容并且附加到ENTRYPOINT
命令最后作为其参数使用
Dockerfile文件中也可以存在多个此指令,但仅有最后一个生效!
在docker run时,使用--entrypoint string选项传递的命令 可以覆盖Dockerfile中
定义的ENTRYPOINT指令
如何让Nginx配置文件接收参数
创建一个脚本:
#!/bin/bash
#
cat > /etc/nginx/conf.d/www.conf <<EOF
 server {
        server_name ${HOSTNAME};
        listen ${IP:-0.0.0.0}:${PORT:-80};
        root ${ROOT:-/web/html};
}
EOF
exec "$@"
chmod +x nginx-conf.sh
Dockerfile文件:
FROM xxx
ENV ROOT='/web/html/'
ADD index.html ${ROOT}
ADD nginx-conf.sh /bin/nginx-conf.sh
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/nginx-conf.sh"]
docker run --name b1 --rm -P -e "PORT=8080" [镜像ID]
注意:必须使用双引号!!!
................................................................................
12 USER命令:
用于指定运行image时的或运行Dockerfile中的任何RUN,CMD或ENTRYPOINT
指令指定的程序时的用户名或UID
默认情况下,container的运行身份为root
格式:
USER <UID>|<UserName>
需要注意的是<UID>可以为任意数字,但实践中其必须为/etc/passwd中某用户的有效
UID否则docker run命令将运行失败!
必须要在容器中的/etc/passwd文件中个存在
....................................................................
13 HEALTHCHECK
健康状态监测
HEALTHCHECK NONE --不要做监测
常用选项:
--interval=DURATION 默认30秒 --多长时间监测一次
--timeout=DURATION 默认30秒 --监测超时时间
--start-period=DURATION --当docker容器启动后,延迟多长时间才健康检查 
默认0秒
--retries=N 默认3次
默认检查多少次在认为失败
响应值:
0--成功
1--失败
2--自定义
应用示例:
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit1
Dockerfile中应用:
HEALTHCHECK --start-period=3s CMD wget -O - -q http://{IP:-0.0.0.0}:${PORT:-80}/
也可以在docker run中定义:
--health-cmd string             
--health-interval duration       
--health-retries int            
--health-start-period duration   
--health-timeout duration    
.................................................................
14 SHELL指令:
["cmd","/S","/C"] --windons
...........................................................
15 STOPSIGNAL命令:
STOPSIGNAL 信号名称
定义停止命令的信号!
SIGKILL --9信号
.............................................................
16 ARG参数:
用于docker build 的过程中使用
可以被--buil-arg当做参数传递过来!
具体应用:
ARG auther=tim
LABLE maintainer=${auther}
docker build --build-arg auther=tom -t xxx ./
在dockerfile中存在的arg变量,如果在docker build 时也
设置了--build-arg变量,这样最终以命令行界面的变量值为
最终值!
.................................................................
17 ONBUILD 
用于在dockerfile中定义一个触发器
dockerfile用于build映像文件,此映像文件亦可作为base image被另一个
dockerfile用作from指定的参数,并以之构建新的影响文件
在后面的这个dockerfile中的from指定在build过程中被执行时,将会触发
创建其base image的dockerfile文件的ONBUILD指定定义的触发器
格式:
ONBUILD 要执行的Dockerfile指令
尽管任何指令都可注册成为触发器指令,但ONBUILD不能自我嵌套
且不会触发from和maintainer指令
使用包含onbuild指定的dockerfile构建的镜像应该使用特殊的标签
例如ruby:2.0-onbuild
在onbuild指令中使用add或copy指令硬格外小心,因为构建过程的上下文
在缺少指定的源文件时会失败!
会在别人引用这个镜像时执行!并不会在首次build过程执行
编写自己的centos
FROM centos # 基础底层
MAINTAINER jwk666 # 作者

# 环境变量
ENV MYPATH /usr/local
# 工作目录
WORKDIR $MYPATH
RUN yum -y install vim #执行安装命令
RUN yum -y install net-tools

EXPOSE 80   #暴露端口

CMD echo $MYPATH    #打印变量
CMD echo "-----END-----"
CMD /bin/bash   #进入目录
生成镜像
docker build -f mydockerfile01 -t mydocker:1.0 .

Docker网络

redis集群
创建一个redis网段
生成文件夹目录
for i in $(seq 1 6)
do
mkdir -p /Users/edz/docker/redis/node-$i/conf
touch /Users/edz/docker/redis/node-$i/conf/redis.conf
cat << EOF >>/Users/edz/docker/redis/node-$i/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1$i
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
创建6个redis容器
docker run -p 6371:6379 -p 16371:16379 --name redis-1 -v /Users/edz/docker/redis/node-1/data:/data -v /Users/edz/docker/redis/node-1/config/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.11 33c654ea77ff redis-server /etc/redis/redis.conf
循环创建
for i in $(seq 1 6)
do
docker run -p 637$i:6379 -p 1637$i:16379 --name redis-$i -v /Users/edz/docker/redis/node-$i/data:/data -v /Users/edz/docker/redis/node-$i/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.1$i redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
进入集群
redis-cli -c

打包

编写dockerfile,把jar包写进去,打成镜像
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值