Docker容器技术

Docker 是一个工具,让你把应用程序及其所有需要的环境打包成一个“盒子”,这个“盒子”可以在任何计算机上快速运行。

1、docker镜像操作

1.1 查看镜像

docker images # 查看镜像  == docker image list 或者 docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   16 months ago   13.3kB

docker images -q # 查看镜像的id

docker images -a # 查看所有镜像

1.2 搜索镜像

docker search [opts] xxx

docker search mysql  # 搜索mysql相关的镜像
NAME                  DESCRIPTION                                     STARS     OFFICIAL
mysql                 MySQL is a widely used, open-source relation…   15356     [OK]
bitnami/mysql         Bitnami container image for MySQL               118
elestio/mysql         Mysql, verified and packaged by Elestio         0
rapidfort/mysql       RapidFort optimized, hardened image for MySQL   25
google/mysql          MySQL server for Google Compute Engine          25
circleci/mysql        MySQL is a widely used, open-source relation…   30
ubuntu/mysql          MySQL open source fast, stable, multi-thread…   64
javanile/mysql        MySQL for development                           0
eclipse/mysql         Mysql 5.7, curl, rsync                          1
ilios/mysql           Mysql configured for running Ilios              1
bitnamicharts/mysql                                                   0
mirantis/mysql                                                        0
cimg/mysql                                                            3
docksal/mysql         MySQL service images for Docksal - https://d…   0

# --filter is-official=true 搜索官方镜像
# --filter stars=10  收藏数量至少10颗星
# --no-trunc  第二列的description不截断,完全展示出来
docker search --filter is-official=true --filter stars=10 --no-trunc mysql
NAME         DESCRIPTION                                                                          STARS     OFFICIAL
mysql        MySQL is a widely used, open-source relational database management system (RDBMS).   15364     [OK]
phpmyadmin   phpMyAdmin - A web interface for MySQL and MariaDB.                                  1024      [OK]

1.3 拉取镜像

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
# 别名 docker pull

docker image pull mysql   # 拉取myql镜像,默认为最近版本
Using default tag: latest
latest: Pulling from library/mysql
6e839ac3722d: Pulling fs layer
ad912193ad5f: Download complete
25d13d87fd8d: Download complete
004d383c75ef: Download complete                                                                                                                                                                                  6d9bbc82a0b8: Download complete                                                                                                                                                                                  81fec07ea550: Download complete
83357cb2d3a5: Downloading [==============>                                    ]  13.64MB/47.71MB
8ffe968b82c1: Download complete
30dfd9a7ed57: Downloading [=======>                                           ]  10.16MB/65.9MB
35844ae33cbe: Waiting

docker image pull mysql:9.0  # 拉取指定版本的mysql镜像

1.4 删除镜像

docker image rm image1 image2 ...   # 删除一个或者多个,可以使用镜像名或者镜像id指定
# 等价于docker image remove image1 ...  或者 docker rmi image1 ...
# 等价于docker rmi -f image1 ...  # 表示强制删除

docker rmi -f $(docker images -aq)  # 删除所有的镜像
docker rmi test:lates               # 删除指定版本的镜像

2、docker容器操作

2.1 启动容器

docker run [opts] image

# 参数说明
--name="container name"  容器名称,用来区分容器
-d   后台方式运行
-it  使用交互方式运行,进入容器
-p   指定容器的端口  -p 8080:8080
    -p  ip:主机端口:容器端口
	-p  主机端口:容器端口  (常用)
	-p  容器端口
	容器端口
-P   随机指定端口

# 启动并进入容器
root@ubuntu2004:/home/scutech# docker run -it centos /bin/bash
[root@edc3bb92ed44 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@edc3bb92ed44 /]# exit  # 从容器退出
exit
root@ubuntu2004:/home/scutech#

2.2 列出容器

docker ps
	 # 默认列出当前正在运行的容器
-a   # 列出当前正在运行的容器,并且带有历史运行过的容器
-n=? # 列出最近创建的容器,?代表最近几个
-q   # 只显示容器的编号

root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@ubuntu2004:/home/scutech# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMES
edc3bb92ed44   centos        "/bin/bash"   3 minutes ago   Exited (0) 2 minutes ago             jovial_kowalevski
2cc8b8022f62   hello-world   "/hello"      11 hours ago    Exited (0) 11 hours ago              nice_haibt
3e3b14ace368   hello-world   "/hello"      14 hours ago    Exited (0) 14 hours ago              hopeful_chaum
root@ubuntu2004:/home/scutech# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
edc3bb92ed44   centos    "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             jovial_kowalevski
root@ubuntu2004:/home/scutech# docker ps -n=2
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                     PORTS     NAMES
edc3bb92ed44   centos        "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago             jovial_kowalevski
2cc8b8022f62   hello-world   "/hello"      11 hours ago    Exited (0) 11 hours ago              nice_haibt
root@ubuntu2004:/home/scutech# docker ps -n=2 -q
edc3bb92ed44
2cc8b8022f62

2.3 退出容器

exit   # 直接停止并退出容器
Ctrl + p + q  # 快捷键,容器不停止退出

root@ubuntu2004:/home/scutech# docker run -it centos /bin/bash
[root@b35e15dfc2c4 /] root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b35e15dfc2c4   centos    "/bin/bash"   17 seconds ago   Up 16 seconds             inspiring_boyd

2.4 删除容器

docker rm 容器id   # 删除指定的容器,但不能删除正在运行的容器,否则,需要加上-f
docker rm -f $(docker ps -aq)  # 查询所有的容器并强制删除
docker ps -a -q | xargs docker rm -f        # 强制删除所有的容器

2.5 启动和停止容器

需要确保已经docker run,否则没有id。这里使用docker run --name=xxx指定的名称亦可。同理容器操作的其他命令。

docker start 容器id     # 启动容器
docker restart 容器id   # 重启容器
docker stop 容器id      # 停止当前正在运行的容器
docker kill 容器id      # 强制停止容器

3、 其他常用命令

3.1 后台启动容器

# docker run -d 镜像名
docker run -d centos

# 问题:docker ps 发现centos停止了,并没有在后台
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有,就会自动停止

3.2 查看日志

docker logs -tf --tail num 容器id
-tf             # -t显示时间戳;-f日志持续输出
--tail number   # 要显示的日志条数

3.3 查看容器中的进程信息ps

docker top 容器id

root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b5fc9a4970ab   centos    "/bin/bash"   13 minutes ago   Up 12 minutes             test_centos
d9f61358b74e   centos    "/bin/bash"   15 minutes ago   Up 14 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker top b5fc9a4970ab
UID                 PID                 PPID                C                   STIME               TTY
TIME                CMD
root                15532               15510               0                   00:55               pts/0
00:00:00            /bin/bash

3.4 查看容器元数据

docker inspect 容器id   # 查看容器元数据

root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b5fc9a4970ab   centos    "/bin/bash"   15 minutes ago   Up 15 minutes             test_centos
d9f61358b74e   centos    "/bin/bash"   18 minutes ago   Up 17 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker inspect b5fc9a4970ab
[
    {
        "Id": "b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c",
        "Created": "2024-09-08T00:54:38.751116341Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 15532,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-09-08T00:55:23.428189587Z",
            "FinishedAt": "2024-09-08T00:55:23.132383829Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/hostname",
        "HostsPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/hosts",
        "LogPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c-json.log",
        "Name": "/test_centos",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "bridge",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                30,
                120
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": [],
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware",
                "/sys/devices/virtual/powercap"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26-init/diff:/var/lib/docker/overlay2/18414ee19fc732d6e729f96ab8d521b3faaa629ca093185e870d1a94c7ccf015/diff",
                "MergedDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/merged",
                "UpperDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/diff",
                "WorkDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "b5fc9a4970ab",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "bbacec4f96b910a0fa2fbb3f8bb33e084382987fa13262357c1d45f4dfe86cff",
            "SandboxKey": "/var/run/docker/netns/bbacec4f96b9",
            "Ports": {},
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "985231f0255a5ad4d76c1f5e54f5780ba0df86e51fdaec10b50ec05f73d242a8",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null,
                    "NetworkID": "0b3c16f039187dfde85f9ed1dacc1ced3ff73e5105bbd713177c57bda1654574",
                    "EndpointID": "985231f0255a5ad4d76c1f5e54f5780ba0df86e51fdaec10b50ec05f73d242a8",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DNSNames": null
                }
            }
        }
    }
]

3.5 进入当前正在运行的容器

# 方式一
docker exec -it 容器id bashshell

root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b5fc9a4970ab   centos    "/bin/bash"   18 minutes ago   Up 17 minutes             test_centos
d9f61358b74e   centos    "/bin/bash"   20 minutes ago   Up 19 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker exec -it b5fc9a4970ab /bin/bash
[root@b5fc9a4970ab /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 方式二
docker attach 容器id
root@ubuntu2004:/home/scutech# docker attach b5fc9a4970ab
[root@b5fc9a4970ab /]#

# 区别
docker exec   # 进入容器气候开启一个新的终端,可以在里面操作
docker attach # 进入容器正在运行的终端,不会启动新的进程。

3.6 从容器拷贝文件到宿主机

droot@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
d9f61358b74e   centos    "/bin/bash"   29 minutes ago   Up 28 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker start test_centos
test_centos
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
b5fc9a4970ab   centos    "/bin/bash"   27 minutes ago   Up 3 seconds              test_centos
d9f61358b74e   centos    "/bin/bash"   29 minutes ago   Up 28 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker attach test_centos
[root@b5fc9a4970ab /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@b5fc9a4970ab /]# touch home/docker.cpp
[root@b5fc9a4970ab /]# ls /home
docker.cpp
[root@b5fc9a4970ab /]# exit
exit
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
d9f61358b74e   centos    "/bin/bash"   30 minutes ago   Up 29 minutes             brave_knuth
root@ubuntu2004:/home/scutech# docker cp test_centos:/home/docker.cpp /home/scutech  # 拷贝数据
Successfully copied 1.54kB to /home/scutech
root@ubuntu2004:/home/scutech# ls
docker.cpp  pre.sh

4、小结

5、部署nginx、tomcat

5.1 docker部署nginx

 # 1、拉取nginx镜像
 docker pull nginx
 # 2、运行并测试
 root@ubuntu2004:/home/scutech# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx         latest    39286ab8a5e1   3 weeks ago     188MB
hello-world   latest    d2c94e258dcb   16 months ago   13.3kB
centos        latest    5d0da3dc9764   2 years ago     231MB
root@ubuntu2004:/home/scutech# docker run -d --name=nginx01 -p 3344:80 nginx
09399c975b900c7f3a31a09a96debfe6e8a6d9f249985c15c1dadae105f09903
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                     NAMES
09399c975b90   nginx     "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds   0.0.0.0:3344->80/tcp, [::]:3344->80/tcp   nginx01
root@ubuntu2004:/home/scutech# curl localhost:3344
<!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>

# 3、进入容器
root@ubuntu2004:/home/scutech# docker exec -it nginx01 /bin/bash
root@09399c975b90:/# ls
bin   dev                  docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc                   lib   media  opt  root  sbin  sys  usr
root@09399c975b90:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@09399c975b90:/# cd /etc/nginx/
root@09399c975b90:/etc/nginx# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params

5.2 docker部署tomcat

# 官方的使用方式
docker run -it -rm tomcat:9.0  
# 一般用来测试,用完即删除容器,通过docker ps -a无法查到了。
# 1、下载tomcat
docker pull tomcat
# 2、启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 3、拷贝资源到webapps目录下
root@ubuntu2004:/home/scutech# docker exec -it tomcat01 /bin/bash
root@65489e0503a7:/usr/local/tomcat# ls
bin           conf             lib      logs            NOTICE     RELEASE-NOTES  temp     webapps.dist
BUILDING.txt  CONTRIBUTING.md  LICENSE  native-jni-lib  README.md  RUNNING.txt    webapps  work
root@65489e0503a7:/usr/local/tomcat# cd webapps
root@65489e0503a7:/usr/local/tomcat/webapps# ls
root@65489e0503a7:/usr/local/tomcat# ls webapps.dist/
docs  examples  host-manager  manager  ROOT
root@65489e0503a7:/usr/local/tomcat# cp -r webapps.dist/ROOT/ webapps/
root@65489e0503a7:/usr/local/tomcat# ls webapps
ROOT

6、docker镜像

docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是通常说的容器层,容器之下都叫镜像层。
在这里插入图片描述

实战
1、启动一个默认的tomcat容器
2、默认的tomcat是没有webapps应用的,如上部署tomcat
3、将ROOT应用拷贝到webapps中
4、将操作过的容器通过commit提交为一个镜像。之后就可以使用这个修改后的镜像了。
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED       STATUS       PORTS                                         NAMES
65489e0503a7   tomcat    "catalina.sh run"   6 hours ago   Up 6 hours   0.0.0.0:3355->8080/tcp, [::]:3355->8080/tcp   tomcat01
root@ubuntu2004:/home/scutech# docker commit -a="huyuanhai" -m="add a default root web app" 65489e0503a7 tomcat_myself:1
.0
sha256:2e24d9ba550607d506b8f5b670c3b5eeefeae2722754fc4a33969d9fb4871dfd
root@ubuntu2004:/home/scutech# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
tomcat_myself   1.0       2e24d9ba5506   4 seconds ago   508MB
nginx           latest    39286ab8a5e1   3 weeks ago     188MB
tomcat          latest    c2a444ea6cd7   4 weeks ago     508MB
hello-world     latest    d2c94e258dcb   16 months ago   13.3kB

7、容器数据卷

7.1 什么是容器数据卷

docker理念:将应用和环境打包成一个镜像。
如果数据都在容器中,那么将容器删除时,数据就会丢失!因此,需要进行数据持久化。
比如MySQL中的数据,需要将其存储在本地。
容器之间可以有一个数据共享技术!docker容器中产生的数据,同步到本地或者是容器之外的地方。
这就是卷技术,也是目录的挂在,将我们容器内的目录,挂载到容器在外的地方。
在这里插入图片描述

7.2 使用容器数据卷

方式一:直接使用docker run命令来实现挂载,加上选项-v

docker run -it -v 主机目录:容器内目录

root@ubuntu2004:/home/scutech# docker run -it -v /home/centos:/home centos /bin/bash
[root@c8d418098fb9 /]#

docker inspect查看元数据如图:
在这里插入图片描述
在宿主机中就可以操作对应的文件目录中的内容了,且两者是同步的,增删改文件都可以。即使容器被删除了,数据还是存在的。

7.3 实战mysql

# 获取镜像
docker pull mysql:5.7

# 运行容器,需要做数据挂载,安装启动mysql,需要配置密码
# 官方写法:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:tag

# 启动
-d 后台启动
-p 端口映射
-v 挂载卷
-e 环境配置
--name 容器名称
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var
/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 启动成功之后,可以在本地使用mysql

映射到主机目录
在这里插入图片描述

7.4 具名挂载和匿名挂载

# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx001 -v /etc/nginx nginx

# 查看所有的volume的情况
root@ubuntu2004:/home/scutech# docker volume ls
DRIVER    VOLUME NAME
local     8a6deb3bdbc58070e093df3be3534bca06918d3af0ce79ebea3e47db3732c7d5

# 匿名挂载就是在-v 时只写了容器内路径,没有写容器外路径!

# 具名挂载
docker run -d -P --name nginx003 -v /home/scutech/juming-nginx:/etc/nginx nginx

# 通过 -v 卷名:容器内路径
# 查看一下这个卷
docker volume inspect volume_name

在这里插入图片描述
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/volume_name/_data
通过具名挂载可以方便找到卷,大多数情况都使用具名挂载

# 区别具名还是匿名挂载
-v 容器内路径  # 匿名
-v 卷名:容器内路径  # 具名

扩展:

# 通过 -v 容器内路径:  + ro或者rw 改变读写权限

# 一旦设置了只读,说明这个路径只能通过宿主机来操作,容器内只读,不可写。
docker run -d -P --name nginx01 -v /home/scutech/nginx01:/etc/nginx:ro nginx  # 只读
docker run -d -P --name nginx01 -v /home/scutech/nginx02:/etc/nginx:rw nginx  # 可读写

7.5 初始dockerfile

dockerfile就是用来构建docker镜像的构建文件,是命令脚本。
通过这个脚本可以生成镜像,镜像是一层层的,脚本的一个个的命令,每个命令就是一层。

# 创建一个dockerfile文件,名字可以随机,建议dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["v1", "v2"]

CMD /bin/bash

在这里插入图片描述

# 启动huyuanhai/centos
docker run -it huyuanhai/centos /bin/bash

在这里插入图片描述
其中v1和v2和宿主机中的某个目录是映射的。
在这里插入图片描述
在这里插入图片描述

7.6 数据卷容器

多个容器之间共享数据
在这里插入图片描述

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7

docker run -d -p 3312:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7

# 启动了三个mysql
root@ubuntu2004:~# docker ps | grep mysql
591b05414af9   mysql:5.7         "docker-entrypoint.s…"   24 seconds ago       Up 23 seconds       33060/tcp, 0.0.0.0:3312->3306/tcp, [::]:3312->3306/tcp   mysql03
df0e74fcf72c   mysql:5.7         "docker-entrypoint.s…"   31 seconds ago       Up 30 seconds       33060/tcp, 0.0.0.0:3311->3306/tcp, [::]:3311->3306/tcp   mysql02
c226c17972f6   mysql:5.7         "docker-entrypoint.s…"   About a minute ago   Up About a minute   33060/tcp, 0.0.0.0:3310->3306/tcp, [::]:3310->3306/tcp   mysql01

在这里插入图片描述
在这里插入图片描述
不同容器之间的数据是共同指向宿主机中的某个挂载位置的,不会因为删除了某个容器导致其他容器数据的缺失。

8、DockerFile

8.1 DockerFile介绍

dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
在这里插入图片描述
很多官方镜像都是基础包,很多功能都没有,所以都需要构建自己需要的镜像。

8.2 DockerFile构建过程

基础知识
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
在这里插入图片描述
dockerfile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件,文件也十分简单。
Docker镜像逐渐成为企业交付的标准。
步骤:开发,部署,运维。。。缺一不可!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务

8.3 DockerFile指令

FROM         # 基础镜像,一切从这里开始构建
MAINTAINER   # 镜像是谁写的,姓名+邮箱
RUN          # 镜像构建的时候需要运行的命令
ADD          # 添加内容,压缩包会自动解压
WORKDIR      # 镜像的工作目录
VOLUME       # 挂载的目录
EXPOSE       # 暴露端口
CMD          # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT   # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD      # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY         # 类似ADD,将文件拷贝到镜像中
ENV          # 构建的时候设置环境变量

在这里插入图片描述

8.4 实战构建

FROM ubuntu:20.04

# RUN apt update && apt install -y \ build-essential \ cmake \ g++ \ libboost-dev

ENV DEBIAN_FRONTEND=noniteractive
ENV TZ=Etc/UTC

RUN apt update && apt install -y build-essential && apt install -y cmake && apt install -y libboost-dev
        # build-essential \
        # cmake
        # ilibboost-dev

WORKDIR /app

COPY . .

RUN mkdir build && cd build && cmake .. && make

CMD ["./app"]
docker build -f Dockerfile -t myxxx:1.0 .

8.5 CMD和ENTRYPOINT 区别

CMD          # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT   # 指定这个容器启动的时候要运行的命令,可以追加命令

在这里插入图片描述
如果上述CMD改成了ENTRYPOINT来实现,那么在docker run xxx -l 是可以继续往后追加的。

8.6 实战tomcat

tomcat + jdk
在ubuntu22.04镜像的基础上配置了tomcat和jdk,并将tomcat启动。

FROM ubuntu:22.04
# MAINTAINER huyuanhai<5533qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u181-linux-x64.tar.gz  /usr/local
ADD apache-tomcat-9.0.94.tar.gz /usr/local

RUN apt update
RUN apt install -y vim

ENV WORKSPACE=/usr/local
WORKDIR $WORKSPACE

ENV JAVA_HOME=/usr/local/jdk1.8.0_181
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME=/usr/local/apache-tomcat-9.0.94
ENV CATALINA_BASH=/usr/local/apache-tomcat-9.0.94
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD ${CATALINA_HOME}/bin/startup.sh && tail -f ${CATALINA_HOME}/logs/catalina.out

生成镜像

docker build -t utomcat .

启动容器

docker run -d -p 9999:8080 utomcat

在宿主机上可以通过以下命令访问tomcat

curl localhost:9999

也可以在启动的时候进行数据卷的挂载,可以在宿主机发布应用。

8.7 发布镜像到DockerHub

1、首先要在DockerHub上注册登录账号
2、在宿主机上登录这个账号,使用docker login命令

root@ubuntu2004:~/ubuntu# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

root@ubuntu2004:~/ubuntu# docker login -u hyh.18816485035@gmail.com
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded

3、登录成功之后,可以提交镜像到DockerHub了,使用 docker push 命令

# 先给要提交的镜像打标签
root@ubuntu2004:~/ubuntu# docker tag utomcat:latest huyuanhai/utomcat:1.0  # 先打标签
root@ubuntu2004:~/ubuntu# docker images
REPOSITORY          TAG       IMAGE ID       CREATED             SIZE
test02              latest    b32d47c8337d   51 minutes ago      591MB
test01              latest    7efe3f0e79fd   56 minutes ago      591MB
huyuanhai/utomcat   1.0       e50385240b8a   About an hour ago   591MB
utomcat             latest    e50385240b8a   About an hour ago   591MB

# 然后推送push
root@ubuntu2004:~/ubuntu# docker push huyuanhai/utomcat:1.0
The push refers to repository [docker.io/huyuanhai/utomcat]
5f70bf18a086: Pushed 
e08d3834731a: Pushed 
f5a51cf1859c: Pushed 
bbb2b13f1f8a: Pushed 
d9074cdd8ebc: Pushed 
1b9b7346fee7: Pushed 
1.0: digest: sha256:150a4f1a746560d9ee1cff1334995c22a37e27601e12cf0714b466cd5955f8df size: 1579

在这里插入图片描述

9、Docker 搭建C++开发环境

基于ubuntu:22.04 搭建一个镜像,要求具备C++开发的相关环境,包括GNU工具集、CMake、boost库、ACE库等。
Dockerfile生成镜像时会将当前工作目录中的项目拷贝到镜像中,并处理,生成对应可执行程序。当生成可执行程序之后进入容器,让用户选择执行程序还是在容器中继续操作。生成的文件都是在build文件夹中,整个项目在启动容器时做映射,为此,可以在宿主机查看所有项目相关的文件。
在这里插入图片描述
在这里插入图片描述

Dockerfile如下:

FROM ubuntu:22.04
LABEL maintainer="huyuanhai <553354863@qq.com>"

RUN apt update
RUN apt install -y vim net-tools
RUN apt install -y build-essential cmake make
RUN apt install -y libboost-dev libace-dev

ENV WORKSPACE=/usr/local/project
WORKDIR $WORKSPACE

COPY . .   # 拷贝项目到工作区 $WORKSPACE

CMD mkdir build && cd build && cmake .. && make && /bin/bash

.dockerignore文件如下:

# 忽略编译生成的 build 目录
build/
run.sh

# 忽略 git 相关文件
.git
.gitignore

# 忽略临时文件
*.tmp
*.log
*.swp

# 忽略 IDE 配置文件
.vscode/
.idea/

# 忽略文档
*.md
*.txt

# 忽略 Dockerfile 本身
Dockerfile

生成镜像

docker build -t test_pro:1.0 .

在这里插入图片描述
run.sh执行脚本

rm -rf build   # 必须先删除,否则会失败

docker run -it --rm -v $PWD:/usr/local/project test_pro:1.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VVPU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值