Docker基础命令,Dockerfile 常用命令

本机Centos上系统部署

system_path=/etc/profile
software_install=/home/centos/*

#start mysql docker

 docker run -d --name mysql -p 3306:3306 -v /home/centos/mysql/config:/etc/mysql/mysql.conf.d/mysqld.cnf -v /home/centos/mysql/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

#start docker redis with external file 注意redis.conf 文件一定得放在公共文件夹中,放到用户文件夹中可能无法访问

docker run -p 6379:6379   -v /data/docker/redis/redis.conf:/etc/redis/redis.conf   -v /data/docker/redis/data:/data --name test_redis   -d redis:3.2 redis-server /etc/redis/redis.conf --appendonly yes

安装教程:https://mp.weixin.qq.com/s/9fg5l6KD_RFeToO7QVa6pQ

docker 常用操作命令

镜像拉取
docker pull appName:tags
镜像查看
docker images
镜像删除
docker rmi -f appName:tags
容器删除
docker rm appName
查看当前运行
docker ps 
# 查看全部
docker ps -a
容器创建并执行
docker run appName:tags
docker run --name myubuntu -i -t ubuntu /bin/bash
-i 标志保证容器中STDIN是开启的, 
-t 标志则是告诉Docker为要创建的容器分配一个伪tty终端,-i,-t两个参数保障了容器提供
一个可交互的shell
--name 为容器指定一个名称ID
-d 指定的容器将以守护式来运行(后台运行)

eg:

docker run --name daemon_myubuntu -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1 ;done" 

该程序将一直打印hello world;

–link :alias 容器间当向通信 (后期版本Docker将淘汰此命令)
-link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。

# 源容器
docker run -d --name selenium_hub selenium/hub
# 接收容器
docker run -d --name node --link selenium_hub:hub selenium/node-chrome-debug
网桥Bridge模式,实现容器间相互通信
# 创建网桥
docker network create my-net
# 启动容器 box1
docker run -it --name box1 --rm --network my-net busybox sh
# 启动容器box2
docker run --name box2 -it --rm  --network my-net busybox sh
# 使用box1中使用容器名称ping box2


/ # ping box2
PING box2 (172.21.0.2): 56 data bytes
64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.229 ms
64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.170 ms
64 bytes from 172.21.0.2: seq=2 ttl=64 time=0.165 ms
64 bytes from 172.21.0.2: seq=3 ttl=64 time=0.168 ms
获取容器日志
docker logs daemon_myubuntu
docker logs -f -t  --tail 10 daemon_myubuntu


可选参数:
-f 监控Docker 容器日志
-t 显示日志生成时间
--tail 日志实时刷新纪录数 --tail 10表示最新的10条记录
运行之前已经创建过的容器
docker start myubuntu
停止运行中的容器(可使用start恢复容器状态)
docker stop myubuntu
停止运行中的容器(不可恢复)
docker kill Name/ID  
重启运行中的容器
docker restart name/ID
在运行的容器中开启一个新的进程

docker exec
eg:

开启一个新的对话框
docker exec -t -i myubuntu /bin/bash
创建一个文件
docker exec -t -i myubuntu touch /etc/new_file
重新附着在之前的容器上(可能需要按下回车才能进入会话)
docker attach myubuntu
自动重启容器
--restart=标志
eg:
 --restart=always 
docker run --restart=always  --name daemon_myubuntu -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1 ;done"

当标志为always时,无论容器是什么退出代码,docker都会自动重启该容器
 --restart=on-failure
当容器退出代码为非0时,Docker 自动重启该容器
 --restart=on-failure:5
当容器退出代码为非0时,Docker 自动重启该容器最多5次
查看容器详情
docker inspect daemon_myubuntu

Dockerfile 命令

From 整个Dockerfile的入口,必须是第一条指令。其代表新制作镜像的基础镜像。
MAINTAINER 作者信息
LABLE 镜像标签,一般添加组织单位信息
Run 构建镜像时执行命令行上的命令。

1.RUN<命令> 类似于直接在终端输入命令 如:

RUN echo '

Hello, Docker!

'

2.exec格式:RUN [“可执行文件”, “参数1”, “参数2”]

COPY 指令 该指令用于将宿主机文件拷贝至镜像内的指定路径。
COPY <源路径>... <目标路径>
或
COPY ["<源路径1>",... "<目标路径>"]
ADD 高级复制 用法和COPY一样
1、ADD过来的压缩包可以自动在目标路径下进行解压
2、原始路径可以是一个连接,ADD过程会尝试从该链接下载所需的文件到目的路径。
3、一般情况下,建议使用COPY而不是ADD,因为COPY过来的文件可以配合使用RUN
来进行解压或是其他操作,搭配使用更灵活,且单条语句所负担的功能唯一。
WORKDIR 类似于cd命令

CMD 服务启动指令 一个Dockerfile只会执行最后一条CMD语句

shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

注意事项:

1、CMD中的启动参数可以被更新覆盖。例如:
Dockerfile中若是用CMD指定启动镜像时执行/bin/bash,那么在启动镜像时输入docker run -it ubuntu ./test.sh 则会用./test.sh命令来覆盖/bin/bash命令。
2、推荐使用exec格式的CMD书写。这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。
3、如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:CMD echo /java
在实际执行中,会将其变更为:
CMD [ "sh", "-c", "echo /java" ]
EVN 设置环境变量,并且可以通过 ${key} 取值进行使用。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ARG 构建参数

语法形式: ARG [=]

ARG在dockerfile中创建一个全局参数,参数可以给定一个默认值,在编译时可以传参对其进
行覆盖。如果ARG指令有默认值并且在构建期间没有接收到参数、则使用默认值。
一个dockerfile中可以包含多个ARG参数。
如:

docker build --build-arg <varname>=<value>
VOLUME 挂载共享卷

格式为:

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

Docker的使用原则除了每个容器干尽量少的事情外,还尽可能要求容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,也就是将本地磁盘的某一个目录挂载至容器内。同时这样的共享目录可以被多个不同的容器所使用。
除了可以在dockerfile中指定这一参数外,在运行启动容器时也可以附带这一参数来指定共享卷:

docker run -it --name container-test -h CONTAINER -v /data debian /bin/bash
USER 指定用户

在书写dockerfile时,某些层的操作若想切换用户名,可以使用该参数指定某些层的用户,并且是存在的用户名。
格式:USER <用户名>
如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu

# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis
# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/gosu-amd64" \
    && chmod +x /usr/local/bin/gosu \
    && gosu nobody true
# 设置 CMD,并以另外的用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]
EXPOSE 暴露端口
EXPOSE <端口1> [<端口2>...]

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

Docker compose 单机自动化部署教程

https://www.runoob.com/docker/docker-compose.html

你可能感兴趣的:(架构师,后端)