基础命令
Docker下载并运行镜像
docker search ubuntu
docker pull ubuntu:latest
docker images
docker run -i -t --name hello ubuntu /bin/bash
run命令创建容器的格式为
docker run <选项> <镜像名称> <要运行的文件>
>> 使用-i -t 表示可以在运行的Bash Shell中进行输入输出
>> 使用 --name选项可以指定容器名称
执行文件在一个与OS完全隔离的空间中运行
启动与连接
docker start hello
docker restart hello
docker ps -a
docker attach hello
从外部运行容器内的命令
docker exec hello echo "Hello World"
docker exec <容器名称> <命令> <形式参数>
终止与删除
docker stop hello
docker rm hello
docker rmi ubuntu:latest
创建Docker镜像
基本Bash命令
> | 表示将命令执行的标准输出保存为文件 |
< | 读取文件内容 |
>> | 将命令执行的标准输出添加到文件 |
2> | 将命令执行的标准错误保存为文件 |
2>> | 将命令执行的标准错误添加到文件 |
&> | 将标准输出与标准错误全部保存为文件 |
1>&2 | 将标准输出发送为标准错误 |
2>&1 | 将标准错误发送为标准输出 |
| | 将命令执行的标准输出发送为其他命令的标准输入 |
$ | Bash的变量。储存时不用$符号,仅输入变量时才用 |
$() | 将命令执行的结果变量化。将命令执行的结果储存到变量 或者传递给其他命令的形式参数时使用 |
`` | 与$()类似,将命令执行结果变量化 |
&& | 一行内运行多个命令,只有前面的命令没有错误才会执行后面的命令。 |
; | 一行内运行多个命令,前面的命令有没有错误都会执行后面的命令。 |
'' | 字符串。不处理''中的变量,只使用变量名。也不会处理"与$(),直接使用 |
"" | 字符串。有变量会替换。 |
" ' ' " | 用于在命令中再次执行命令制定形式参数 |
\$ | "中用来转义 |
${} | 在""的字符串中输出变量 还可以设置变量默认值 HELLO=${HELLO-"abcd"} #若有HELLO变量,则输出,否则赋为abcd WORLD=${WORLD:-"abcd"} #若WORLD变量有值,则输出,否则赋为abcd |
\ | 将一行命令写成多行 |
{1..10} | 同于表示连续数字 |
{str1,str2} | 在{}内指定多个字符串,减少命令执行次数。 |
if | if [ $a -eq $b ]; then echo $a fi 比较数字 -eq ; -ne ; -gt ; -ge ; -lt ; -le 比较字符串 =,== != -z:字符串为NULL -n:字符串不为NULL |
for | 循环 |
while | 循环 |
<<< | 将字符串发送到命令的标准输入 |
<<EOF EOF | 将多行字符串发送到命令的标准输入 |
export | 设置环境变量 |
printf | 以指定格式输出值。与管道配用,向命令输入值 |
sed | 更改文本文件中的指定字符串 sed -i "s/<待查找字符串>/<替换字符串>/g" <文件名> |
# | 注释 |
编写Dockerfile
FROM ubuntu:latest
MAINTAINER FlowerYang
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
VOLUME ["/data","/etc/nginx/site-enabled","/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
EXPOSE 443
FROM: 指定基于的基础镜像
MAINTAINER: 维护者信息
RUN: 运行SHELL脚本或命令
>>由于创建镜像的过程中不能接受用户输入,所以在apt-get install命令中使用-y选项
>>VOLUME: 要与主机共享的目录。也可以在docker run命令中使用-v选项进行设置。例如:-v /root/data:/data是将主机的/root/data目录连接到Docker容器的/data目录
CMD: 指定容器启动时执行的文件或Shell脚本
WORKDIR: 为CMD中设置的可执行文件设置运行目录
EXPOSE: 与主机相连的端口号。
使用BUILD命令创建镜像
docker build --tag hello:0.1 .
--tag可以设置镜像名称与标签
随后再运行容器
docker run --name hello-nginx -d -p 80:80 -v /Users/acheing/Docker/Lab1:/data hello:0.1
-d:表示在后台运行容器
-P 80:80:表示将主机的80号端口与容器的80号端口连接起来。
-v <>:<>:将主机的目录连接到容器的目录
可以通过127.0.0.1:80访问
查看Docker
查看镜像生成的历史
docker history hello:0.1
使用cp命令复制文件
docker cp hello-nginx:/etc/nginx/nginx.conf /Users/acheing/docker/Lab1
docker cp <容器名称>:<路径> <主机目录>
commit命令从容器的修改中创建镜像
docker commit -a "Acheing" -m "add hello.txt" hello-nginx hello:0.2
-a选项是提交的用户信息
-m选项是注册信息
diff检查文件中容器的修改
docker diff hello-nginx
A表示添加的文件
C表示修改的文件
D表示删除的文件
inspect查看详细信息
docker inspect hello-nginx
灵活使用Docker
搭建Docker私有仓库
Docker仓库服务器名为Docker注册(Registry)服务器。
存储镜像数据到本地
先下载Docker注册镜像
docker pull registry:latest
以容器运行registry:latest镜像
docker run -d -p 6000:5000 --name hello-registry \
-v /Users/acheing/Docker/Registry:/tmp/registry \
registry
这里用6000是因为我本地的5000端口好像被占用了QwQ
使用push命令上传镜像
docker tag hello:0.1 localhost:6000/hello:0.1
docker push localhost:6000/hello:0.1
使用pull命令下载
docker pull localhost:6000/hello:0.1
创建私有仓库
死活整不出来。。。
弄到一半还地震了。。。
先留着
连接Docker容器
例如连接nginx与MongoDB
docker run --name db -d mongo
docker run --name web -d -p 80:80 --link db:db nginx
docker run命令时,若本地无镜像,则自动下载镜像
连接选项格式为 --link <容器名称>:<别名>
但好像还是有问题。。。
连接其他服务器的Docker容器
使用Ambassador容器
不大行
Docker数据卷
Docker数据卷将数据存储到主机,即使使用docker commit创建新镜像,数据卷的修改项也不会被包含
创建容器卷:
docker run -i -t --name hello-volume -v /data ubuntu /bin/bash
数据卷选项格式: -v <容器目录>
接下来查看主机上数据卷的路径
~ docker inspect hello-volume | grep Mounts -A 10
"Mounts": [
{
"Type": "volume",
"Name": "70491361c1867912e3b310942ba978a9fbffec1c4cc89e09bed8657047f886da",
"Source": "/var/lib/docker/volumes/70491361c1867912e3b310942ba978a9fbffec1c4cc89e09bed8657047f886da/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
但Mac上好像不大行QwQ
使用Docker数据卷容器
创建数据卷容器
docker run -i -t --name hello-volume -v ~/Docker/Volume/:/data ubuntu /bin/bash
创建普通容器,并连接到数据卷容器
docker run -i -t --volumes-from hello-volume --name hello ubuntu /bin/bash
详细了解Dockerfile
Dockerfile文件中,命令总是以FROM命令开始,且各命令独立运行
.dockerignore
需要从上下文中忽略某些文件或目录时,使用该文件。
FROM
用于设置以哪种镜像为基础创建镜像
MAINTAINER
设置创建镜像者的信息
RUN
使用shell运行命令
RUN apt-get install -y nginx
无shell直接运行
RUN ["apt-get","install","-y","nginx"]
CMD
CMD用于设置容器启动时运行的脚本或命令
用shell运行命令
CMD <命令>
无shell直接运行
CMD ["<可执行文件>","<形式参数1>","<形式参数2>"]
使用ENTRYPOINT
此时CMD只能用于将形式参数传递给ENTRYPOINT设置的命令并运行
ENTRYPOINT
和CMD挺像的
但在docker run中设置了可执行文件后的结果不同
EXPOSE
设置与主机相连的端口号
ENV
设置环境变量,设置的环境变量应用于RUN,CMD,ENTRYPOINT
ENV <环境变量> <值>
ADD
ADD用于向镜像添加文件
ADD <要复制文件的路径> <文件在镜像中的路径>
其中<要复制文件的路径>以上下文目录为基准
<要复制文件的路径>还可以设置为目录或网页文件URL
COPY
感觉COPY和ADD挺像的,就是不能复制网址或者解压缩
VOLUME
VOLUME设置用于将目录下的内容存储到主机而非容器
格式为VOLUME <容器目录>或VOLUME["容器目录1","容器目录2"]
但不能与主机的特定目录进行连接
USER
用于设置运行命令的用户账户
WORKDIR
用于设置执行RUN,CMD,ENTRYPOINT命令的目录
ONBUILD
将当前镜像为基础镜像创建子镜像时要触发的命令
用Docker把自动打卡部署到服务器上
FROM ubuntu:latest
MAINTAINER FlowerYang <acheing.com>
RUN apt-get update
RUN apt-get -y install cron
RUN apt-get clean
RUN mkdir AutoPunch
ADD Daka /AutoPunch
ADD requirements.txt /AutoPunch
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN pip3 install -r /AutoPunch/requirements.txt
ADD run.sh /AutoPunch/run.sh
RUN echo '1 16 * * * sh /AutoPunch/run.sh 2>> /AutoPunch/run.log' > con
RUN crontab con
RUN rm con
CMD bash -c '/etc/init.d/cron start';'bash'
run.sh
#!/bin/bash
cd /AutoPunch
python3 Daka.py >> Daka.log
上面的都是一些比较基本的操作
先学到这里吧OvO
Comments | NOTHING