环境打包,将运行环境打包发布,解决环境不一致的问题。
三大要素:仓库、镜像、容器
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 version
docker info
docker --help
常用参数
拉取一个镜像(不写版本默认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
1.启动容器
docker run[OPTION] image[COMMAND][ARG...]
docker ps[OPTION]
停止容器退出
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 commit -a "作者" -m "信息" 容器ID 名字:版本
docker commit -a "sly" -m "tomcat without docs" e136a2f4aa7c sly/tomcat:1.0
特点:
容器内添加
命令添加:
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容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
容器间传递共享 --volume-from
docker run -it --name centos02 --volumes-from centos01 sly/centos_volume
容器之间配置信息的传递,数据卷生命周期一直持续到没有容器使用它为止。
DockerFile基础知识
每条保留字指令都得大写,且至少要跟随一个参数。
指令从上到下顺序执行。
#表示注释。
每条指令都会创造一个新的镜像层,并对镜像进行提交。
docker执行DockerFile的大致流程
BUILD | Both | RUN |
---|---|---|
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
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<[email protected]>
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<[email protected]>
#把宿主机当前上下文的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