赞
踩
环境说明
环境配置的难题
如何解决
Docker如何解决依赖的兼容问题?
Docker如何解决不同系统环境的问题?
Docker允许开发中将应用、依赖、函数库、配置-起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行
虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。
Docker和虚拟机都是基于软件的平台虚拟化技术,其中:
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、 分发镜像的服务,Docker Registry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository) ; 每个仓库可以包含多个标签(Tag) ;每个标签对应一个镜像。
通常,一个仓库会包含同-个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过**<仓库名>:<标签>**的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
以Ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过ubuntu:16.04,或者ubuntu:18.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如ubuntu,那将视为ubuntu:latest。
DockerHub: DockerHub是一个Docker镜像的托管平台。 这样的平台称为Docker Registry.
国内也有类似于DockerHub的公开服务,比如网易云镜像服务、阿里云镜像库等。
卸载旧版Docker(可选)
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
安装yum工具
yum install -y yum-utils
镜像配置
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
yum makecache fast
下载安装Docker
yum install docker-ce docker-ce-cli containerd.io
启动Docker
systemctl start docker
查看Docker版本
docker version
设置开机自启动Docker服务
systemctl enable docker.service
镜像加速
# 进入docker配置的目录
cd /etc/docker/
# 创建 daemon.json
touch daemon.json
# 编辑这个文件
vim daemon.json
# 输入这些内容,其中url改成自己的加速器地址,亦可使用该地址
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}
# 加载配置
systemctl daemon-reload
# 重启docker服务
systemctl restart docker
镜像名称
镜像操作命令
镜像操作示例
[root@server ~]# docker run --name mynginx -d -p 80:80 nginx
ef6939316656b697592b95ae6e0c71f5112acc104eec8b796f88fd88fb49e8bf
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef6939316656 nginx "/docker-entrypoint.…" 12 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp mynginx
[root@server ~]#
访问nginx 宿主机 ip:80 (eg:192.168.70.23:80)
192.168.70.23:80
停止容器与启动
docker stop mynginx
[root@server ~]# docker stop mynginx
mynginx
[root@server ~]# docker start mynginx
mynginx
[root@server ~]#
修改指定端口
// 删除容器之前先将容器停止
[root@server ~]# docker stop mynginx
mynginx
[root@server ~]# docker rm mynginx
mynginx
[root@server ~]# docker run --name mynginx -d -p 8080:80 nginx
66bc63dbeba824ef8fb0bde7e1f32c785b1ddbe0854fd9d85e2548893e92fc73
[root@server ~]#
[root@server ~]# docker run --name myredis -d -p 6379:6379 redis fbca3d6519e74df81fe0508212e4879ff68a753d5c8002d5af55bee198a6ca66 [root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fbca3d6519e7 redis "docker-entrypoint.s…" 57 seconds ago Up 55 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis 66bc63dbeba8 nginx "/docker-entrypoint.…" 16 minutes ago Up 16 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp mynginx [root@server ~]# //进入容器操作 [root@server ~]# docker exec -it myredis bash root@fbca3d6519e7:/data# ls root@fbca3d6519e7:/data# pwd /data root@fbca3d6519e7:/data# cd / root@fbca3d6519e7:/# ls bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@fbca3d6519e7:/# redis-cli 127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> get name "zhangsan" 127.0.0.1:6379> exit root@fbca3d6519e7:/# exit exit [root@server ~]#
容器中的数据问题
我们可以把“数据卷”Data Volumes理解成"宿主机中的目录”,当把某个卷和容器中的某个目录建立映射关系后,就相当于把宿主机中的某个目录和容器中的某个目录建立了映射关系
`数据卷提供了很多有用的特性:
数据卷操作的基本语法为: docker volume [COMMAND],其中COMMAND可选值:
[root@server ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fbca3d6519e7 redis "docker-entrypoint.s…" 7 hours ago Up 7 hours 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis 66bc63dbeba8 nginx "/docker-entrypoint.…" 7 hours ago Up 7 hours 0.0.0.0:8080->80/tcp, :::8080->80/tcp mynginx [root@server ~]# docker volume create testA testA [root@server ~]# docker volume ls DRIVER VOLUME NAME local 819bc24f39a076ba9cad018ef5d21057c6167f7f1b725f7a8672146b7badb22b local testA [root@server ~]# [root@server ~]# docker volume inspect testA [ { "CreatedAt": "2024-06-05T16:36:46+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/testA/_data", "Name": "testA", "Options": null, "Scope": "local" } ] [root@server ~]#
挂载卷
[root@server ~]# docker run --name testAcon -v testA:/data -d redis
4adb46afd44661b0b5b056d77367078ef634a7ded164fb7cb10cc24fed12f263
[root@server ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4adb46afd446 redis "docker-entrypoint.s…" 17 seconds ago Up 16 seconds 6379/tcp testAcon
[root@server ~]#
[root@server ~]# docker exec -it testAcon bash
root@4adb46afd446:/data# ls
root@4adb46afd446:/data# pwd
/data
root@4adb46afd446:/data# ls
a.txt
root@4adb46afd446:/data# echo hell >> a.txt
root@4adb46afd446:/data#
复制打开新的终端
[root@server ~]# cd /var/lib/docker/volumes/
[root@server volumes]# ls
819bc24f39a076ba9cad018ef5d21057c6167f7f1b725f7a8672146b7badb22b backingFsBlockDev metadata.db testA
[root@server volumes]# cd testA/_data/
[root@server _data]# ls
[root@server _data]# cat a.txt
hell
[root@server _data]#
两个终端都有a.text证明数据已经同步
[root@server _data]# docker run --name testBcon -v testA:/data -v tsetB:/var/log -d redis
444ed6de99c2bdae2c91b01da4537b83125f31aceb54916f3f69132d8a4c5c37
[root@server _data]# ls /var/lib/docker/volumes/
819bc24f39a076ba9cad018ef5d21057c6167f7f1b725f7a8672146b7badb22b backingFsBlockDev metadata.db testA tsetB
[root@server _data]#
绑定挂载
前面创建的数据卷都存放在/var/lib/docker/volumes目录中,这个目录是固定的,它们都能被docker volume命令管理。
docker还有一种映射宿主机目录的方法,这种方法被称之为”绑定挂载”,绑定挂载能够将指定的宿主机目录挂载到容器中,只需要将卷名替换成宿主机.上的目录路径即可
docker run -d --name testAcon -v /root/test1:/data1 redis
上述命令将宿主机的/root/test1目录映射到容器的/data1目录中
绑定挂载不会生成任何卷,它直接将指定的宿主机目录映射到容器中,所以,docker volume命令无法查看或管理到绑定挂载的路径
官方建议使用卷,而不是绑定挂载,但是,绑定挂载有一个优势,就是绑定挂载可以直接将宿主机中的文件(非目录)直接挂载到容器中,比如,将宿主机中的/etc/localtime文件映射到容器中的/etc/localtime文件
docker run -d --name testAcon -V /etc/localtime:/etc/localtime alpine
通常,使用绑定挂载就是为了将宿主机中的配置文件挂载到容器中,如果是整个目录的数据,建议使用卷,卷只能映射目录,不能映射文件。
[root@server ~]# docker start mynginx mynginx [root@server ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 444ed6de99c2 redis "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 6379/tcp testBcon 4adb46afd446 redis "docker-entrypoint.s…" 27 minutes ago Up 27 minutes 6379/tcp testAcon 66bc63dbeba8 nginx "/docker-entrypoint.…" 8 hours ago Up 1 second 0.0.0.0:8080->80/tcp, :::8080->80/tcp mynginx [root@server ~]# [root@server ~]# docker exec -it mynginx bash root@66bc63dbeba8:/# cd /usr/share/nginx/html/ root@66bc63dbeba8:/usr/share/nginx/html# ls 50x.html index.html root@66bc63dbeba8:/usr/share/nginx/html# cat index.html <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> root@66bc63dbeba8:/usr/share/nginx/html#
演示
[root@server ~]# docker run --name myng -v html:/usr/share/nginx/html -p 80:80 -d nginx
36cb2905a4406c2222ced95512970e11e2cbf2ee2107b3f04c4dcebe5681b74f
[root@server ~]# cd /var/lib/docker/volumes/html/_data/
[root@server _data]# ls
50x.html index.html
[root@server _data]# vim index.html
[root@server _data]#
修改
<h1>Welcome to nginx!</h1> <h1>Welcome to hell!</h1>
对于Docker用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的数据库、中间件、应用软件等都有现成的Docker官 方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用。
某些情况下我们也不得不自己构建镜像,比如:
如果只是使用镜像,当然不需要了解镜像的内部结构,直接通过docker命令 下载和运行就可以了,但如果我们想创建自己的镜 像,或者想理解Docker为什么是轻量级的,就非常有必要学习这部分知识了。
[root@server _data]# docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest [root@server _data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4f67c83422ec 6 days ago 188MB redis latest 1a83fd5edeed 13 days ago 117MB hello-world latest d2c94e258dcb 13 months ago 13.3kB [root@server _data]# docker run hello-world 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/ [root@server _data]#
Dockerfile
FROM scratch
COPY hello /
CMD [" /hello"]
base镜像
[root@server _data]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Downloading [=================> ] 29.04MB/83.52MB ^C [root@server _data]# docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:latest docker.io/library/centos:latest [root@server _data]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 4f67c83422ec 6 days ago 188MB redis latest 1a83fd5edeed 13 days ago 117MB hello-world latest d2c94e258dcb 13 months ago 13.3kB centos latest 5d0da3dc9764 2 years ago 231MB [root@server _data]#
为何系统镜像如此之小
Linux操作系统由内核空间和用户空间组成
CentOS的Dockerfile
base镜像提供的是最小安装的Linux发行版,CentOS镜像的Dockerfile的内容
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
CMD ["/bin/bash"]
Docker支持运行多种Linux OS
构建镜像
FROM | 指定基础镜像 | FROM centos:6 |
---|---|---|
NVE | 设置环境变量,可在后面指定作用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-8.7rpm /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
创建文件夹,将jdk安装包上传到该目录下
mkdir -p /root/dockerfile/java
在/root/dockerfile/java目录下创建文件dockerfile_java,内容如下:
FROM centos:7 # 配置环境变量,JDK的安装目录 ENV JAVA_DIR=/usr/local # 拷贝jdk和java项目的包 COPY ./jdk-8u171-linux-x64.tar.gz $JAVA_DIR/ COPY ./demo-0.0.1-SNAPSHOT.jar /tmp/app.jar # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk-8u171-linux-x64.tar.gz \ && mv ./jdk1.8.0_171 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 暴露端口 EXPOSE 8080 # 入口,java项目的启动命令 ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]
#docker build -f 文件名 -t 镜像名 .代表当前目录
docker build -f dockerfile_java -t myjava:1.0 .
[root@server java]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjava 1.0 964df2decf1e 2 minutes ago 836MB
nginx latest 4f67c83422ec 6 days ago 188MB
redis latest 1a83fd5edeed 13 days ago 117MB
hello-world latest d2c94e258dcb 13 months ago 13.3kB
centos latest 5d0da3dc9764 2 years ago 231MB
[root@server java]#
[root@server java]# docker run --name myjava -d -p 8020:8080 myjava:1.0
143e26858f29e371a7740fc9024a1de791a887315a0a0bc7a09750932f4c6d81
[root@server java]#
在/root/dockerfile/java目录下创建文件dockerfile_java2,内容如下:
FROM openjdk:8-alpine
COPY ./demo-0.0.1-SNAPSHOT.jar /tmp/app.jar
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]
#docker build -f 文件名 -t 镜像名 .代表当前目录
docker build -f dockerfile_java2 -t myjava:2.0 .
[root@server java]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myjava 2.0 1e0641859ffb 39 seconds ago 158MB
myjava 1.0 964df2decf1e 33 minutes ago 836MB
nginx latest 4f67c83422ec 6 days ago 188MB
redis latest 1a83fd5edeed 13 days ago 117MB
hello-world latest d2c94e258dcb 13 months ago 13.3kB
centos latest 5d0da3dc9764 2 years ago 231MB
[root@server java]#
[root@server java]# docker run --name myjava2 -d -p 8081:8080 myjava:2.0
4d3961be3a62680b08c0a4447dc5fe1f527b83a6d516fe9c96ce873eba9ea040
[root@server java]#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。