docker学习笔记

docker思想

环境打包,将运行环境打包发布,解决环境不一致的问题。

三大要素:仓库、镜像、容器

  • 仓库:用来存放镜像
  • 镜像:用来生成容器实例
  • 容器:用来运行一种服务
    在这里插入图片描述

docker安装

1. 环境

centos6.5以上

步骤

1.卸载旧版本

> yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.安装仓库

> yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

> yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

3.选项配置

> yum-config-manager --enable docker-ce-nightly

> yum-config-manager --enable docker-ce-test

> yum-config-manager --disable docker-ce-nightly

4.安装docker

> yum install docker-ce docker-ce-cli containerd.io

5.开启docker

> systemctl start docker

6.配置阿里云镜像

> tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n74zdj48.mirror.aliyuncs.com"]
}
EOF

> systemctl daemon-reload

> systemctl restart docker

7.hello-world

> docker run hello-world

result:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:6540fc08ee6e6b7b63468dc3317e3303aae178cb8a45ed3123180328bcc1d20f
Status: Downloaded newer image for hello-world:latest
WARNING: IPv4 forwarding is disabled. Networking will not work.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker机制和原理

1.docker有着更少的抽象层:

  • docker不需要Hypervisor实现硬件资源虚拟化,运行在docker上的程序都是直接使用硬件资源。
  • docker利用的是宿主机的内核,而不是虚拟机的,因此docker不需要和虚拟机一样重新加载一个操作系统内核
    在这里插入图片描述

docker帮助命令

常用

docker version

docker info

docker --help

docker镜像命令

常用参数

拉取一个镜像(不写版本默认latest)
docker pull [image name]:[version]

删除一个或多个镜像(不写版本默认latest)
docker rmi [image name]:[version]...

删除全部镜像
docker rmi ${docker images -qa}
Usage:	docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

docker容器命令

1.启动容器

docker run[OPTION] image[COMMAND][ARG...]

在这里插入图片描述
2.列出所有正在运行的容器

docker ps[OPTION]

在这里插入图片描述
3.退出容器

停止容器退出
exit

不停止容器退出
ctrl + P + Q

4.启动容器

docker start [containerName/containerId]

5.关闭容器

正常停止(相当于电脑点关机)
docker stop [containerName/containerId]

强制停止(相当于电脑拔电源)
docker kill [containerName/containerId]

6.删除已停止容器

docker rm [containerName/containerId]

7.强制删除(可以删除运行中的)

docker rm -f [containerName/containerId]

8.删除多个容器

docker rm -f ${docker pa -a -q}

docker ps -a -q | xargs docker rm

9.启动守护式容器

docker run -d image

10.查看容器日志

docker logs -f -t --tail 容器ID

-f          加入时间戳
-t          跟随最新的日志打印
--tail 数字 显示最后多少条

11.查看容器内运行的进程

docker top 容器ID

12.查看容器内部细节

docker inspect 容器ID

13.进入正在运行的容器并以命令行进行交互

docker attach 容器ID                //这种方法会进入容器

docker exec -it 容器ID 要执行的命令  //这种方法没有进入容器,但是将命令结果返回到宿主机

docker exec -it 容器ID /bin/bash    //这种方法会进入容器

14.从容器内拷贝文件到宿主机上

docker cp 容器ID:容器内路径 目的主机路径
例子:
docker cp f9f87890f1af:/temp.cfg /root

docker镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提交镜像

docker commit -a "作者" -m "信息" 容器ID 名字:版本 

docker commit -a "sly" -m "tomcat without docs" e136a2f4aa7c sly/tomcat:1.0

可以在本地看到你修改后提交的镜像
在这里插入图片描述

docker容器数据卷

特点:

  • 数据卷可以在容器之间共享或重用数据
  • 卷中的更改可以直接生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷生命周期一直持续到没有容器使用它为止

添加容器卷

容器内添加

  • 命令添加
  • DockerFile添加

命令添加:

docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名

docker run -it --name centos03 -v /usr/local/sly/dataVolume:/dataVolumeContainer centos

在这里插入图片描述

在宿主机容器卷创建一个host.txt文件后进入容器查看dataVolumeContainer发现也有host.txt。
在这里插入图片描述

在容器内修改了host.txt后,退出到宿主机打开可以查看到修改。

容器停止后宿主机修改依然会同步。

命令带权限

docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

dockerFile添加

可在dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。
创建一个dockerfile。

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finisher,---------------success"
CMD /bin/bash

这一段等于是:
docker run -it -v /host:/dataVolumeContainer1 -v /host:/dataVolumeContainer2 centos /bin/bash

根据dockerfile来build生成一个镜像。

docker build -f /usr/local/sly/mydocker/dockerfile -t sly/centos_volume .
ps:不要忘了命令后面的点。

根据生成的镜像run一个容器。

docker run -it sly/centos_volume

可以使用docker inspect查看生成容器对应的主机地址。
在这里插入图片描述

数据卷容器

docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

容器间传递共享 --volume-from

docker run -it --name centos02 --volumes-from centos01 sly/centos_volume

在这里插入图片描述

容器之间配置信息的传递,数据卷生命周期一直持续到没有容器使用它为止。

DockerFile解析

DockerFile基础知识

每条保留字指令都得大写,且至少要跟随一个参数。
指令从上到下顺序执行。
#表示注释。
每条指令都会创造一个新的镜像层,并对镜像进行提交。

docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器。
  2. 执行一条指令并对容器做出修改。
  3. 执行类似docker commit的操作提交一个新的镜像层。
  4. docker再基于刚提交的镜像运行一个容器。
  5. 执行dockerfile中的下一条指令知道所有指令都执行完成。

dockerfile保留字指令

BUILDBothRUN
FROMWORKDIRCMD
MAINTAINERUSERENV
COPYEXPOSE
ADDVOLUME
RUNENTRYPOINT
ONBUILD
.dockerignore

FROM

基础镜像,新的镜像基于哪个镜像。

MAINTAINER

镜像维护者的姓名和邮箱地址。

RUN

容器构建时需要运行的命令。

EXPOSE

容器对外暴露出的端口。

WORKDIR

创建容器后,终端默认登录进来的工作目录。

ENV

用来在镜像构建过程中设置环境变量。

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。

COPY

类似于ADD,不过只能拷贝。

VOLUME

容器数据卷,用于数据保存和持久化工作。

CMD

指定一个容器启动时要运行的命令。
DockerFile中可以有多个CMD命令,但是只有最后一个会生效。

ENTRYPOINT

指定一个容器启动时要运行的命令。
目的和CMD一样,都是指定容器启动程序和参数。(它不存在被覆盖的问题)

ONBUILD

当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。

下面这个在标准centos上新增的vim和net-tools

FROM centos
MAINTAINER sly<1311220942@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success------------end"
CMD /bin/bash

ENTRYPOINT追加命令运行

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://ip.cn"]
[root@localhost mydocker]# docker run --name centos_curl sly/centos_curl -i
HTTP/1.1 200 OK
Date: Fri, 16 Aug 2019 06:00:13 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=db2118e83d70fcd1438d60d1436541eff1565935213; expires=Sat, 15-Aug-20 06:00:13 GMT; path=/; domain=.ip.cn; HttpOnly
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 50712fccdf56989f-LAX

{"ip": "171.83.124.25", "country": "湖北省武汉市", "city": "电信"}

ONBUILD

father

FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://ip.cn"]
ONBUILD RUN echo "I'am your father!"

son

FROM sly/centos_father
RUN yum install -y curl
ENTRYPOINT ["curl","-s","https://ip.cn"]

[root@localhost mydocker]# docker build -f /usr/local/sly/mydocker/dockerfile5 -t sly/centos_son .
Sending build context to Docker daemon  6.144kB
Step 1/3 : FROM sly/centos_father
# Executing 1 build trigger
 ---> Running in 60fdcae52e20
I'am your father!
Removing intermediate container 60fdcae52e20
......

自己做一个Tomcat容器

FROM centos
MAINTAINER sly<1311220942@qq.com>

#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usrlocal/container.txt

#把java与tomcat添加到容器
ADD jdk-8u171-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.0.tar.gz /usr/local

#安装vim编辑器
RUN yum install -y vim

#设置工作访问时候的WORKDIR路径,登录落脚点。
ENV MYPATH /usr/local
WORKDIR $MYPATH

#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器运行1时监听的端口
EXPOSE 8080

#启动时运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -f /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

docker安装MySQL5.6

docker run -p 12345:3306 --name mysql \
-v /mysql/conf:/etc/mysql/conf.d
-v /mysql/logs:/logs
-v /mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.6

docker安装redis4

docker run -p 6379:6379 --name redis4014 --privileged=true -v /root/volume/redis/data:/data -v /root/volume/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:4.0.14 redis-server /etc/redis/redis.conf --requirepass "123456" --appendonly yes
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值