基础命令

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}在{}内指定多个字符串,减少命令执行次数。
ifif [ $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


告别纷扰,去寻找生活的宝藏。