docker

什么是docker

  • docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
  • 因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,程序员再也无法施展表演才华了,不会再有“在我的环境上可以运行”,真正实现“build once, run everywhere”。
  • 此外docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。

架构

Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布.client
和server可以运行在同一台集群,也可以通过跨主机实现远程通信。

安装部署

yum install -y gcc gcc-c++ yum-utils device-mapper-persistent-data lvm2

添加软件源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新并安装Docker-CE

yum makecache fast
yum -y install docker-ce

启动

systemctl start docker
systemctl enable docker
systemctl status docker

配置镜像加速

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://syos67x1.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

镜像常用命令

查看命令image

命令帮助

docker images --help

Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Aliases:
  docker image ls, docker image list, docker images

ls 选项

docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       latest    ba6acccedd29   17 months ago   72.8MB

表头说明:

列命说明
REPOSITORY仓库
TAG版本号
latest:表示最新版本
IMAGE ID镜像ID
CREATED创建时间
SIZE镜像大小

ls -a

  • 显示所有镜像,包括历史记录都显示出来!
docker image ls -a
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       latest    ba6acccedd29   17 months ago   72.8MB

ls -q

  • 只显示镜像ID
docker image ls -q
ba6acccedd29

查询镜像名search

帮助命令

docker search --help

Usage:  docker search [OPTIONS] TERM

Search Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results
      --no-trunc        Don't truncate output

查询镜像

docker search redis
查询结果截图

说明:

列名称说明
NAME镜像名
DESCRIPTION镜像描述
STARS点赞数
OFFICIAL是否经过官方认证,OK表示是
AUTOMATED是否是自动构建的,OK表示是

–limit 参数

  • 说明:默认显示 STARS 数最多的25条记录,我们使用limit选项只显示前5条记录!
docker search --limit 5 redis
NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                    Redis is an open source key-value store that…   11976     [OK]       
redislabs/redisearch     Redis With the RedisSearch module pre-loaded…   56                   
redislabs/redisinsight   RedisInsight - The GUI for Redis                82                   
redislabs/rebloom        A probablistic datatypes module for Redis       22                   [OK]
redislabs/redis          Clustered in-memory database engine compatib…   36

拉取镜像pull

拉取镜像到本地

demo

docker pull wordpress
Using default tag: latest
latest: Pulling from library/wordpress
a2abf6c4d29d: Pull complete 
c5608244554d: Pull complete 
2d07066487a0: Pull complete 
1b6dfaf1958c: Pull complete 
32c5e6a60073: Pull complete 
90cf855b27cc: Pull complete 
8b0f1068c586: Pull complete 
5355461305e8: Pull complete 
ad1eec592342: Pull complete 
e03fbc76cb78: Pull complete 
1f5796e48b39: Pull complete 
72fbe8e1d4e7: Pull complete 
96edece66175: Pull complete 
5f46f0743de2: Pull complete 
c9f9671a5e1f: Pull complete 
3f543dcd35b1: Pull complete 
c88e21a0c2a0: Pull complete 
964b4457a910: Pull complete 
0d55fb9a64ef: Pull complete 
fb009ff7c567: Pull complete 
4f058a67a50d: Pull complete 
Digest: sha256:fc33b796b04162a0db2e9ea9b4c361a07058b21597b1317ad9ab3ea4593de241
Status: Downloaded newer image for wordpress:latest
docker.io/library/wordpress:latest

docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
wordpress     latest    c3c92cc3dcb1   15 months ago   616MB
 注意:
docker pull 镜像名 直接拉取最新版本
docker pull 镜像名:版本号 拉取的是指定版本号的镜像

system df

  • 查看镜像、容器、本地数据卷的存储空间
docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         1         616MB     616MB (99%)
Containers      1         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

删除镜像命令rmi

删除镜像命令

docker rmi hello-world:latest 
Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container fe86b1c42f7e is using its referenced image feb5d9fea6a5

如果出现上面的情况可以使用 -f 参数强制删除

docker rmi -f hello-world:latest 
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

docker 虚悬镜像

  • 仓库名、标签都是的镜像,俗称虚悬镜像 dangling image

容器常用命令

  • 从镜像库汇中创建并运行新容器

启动命令run

获取命令帮助

docker run --help

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Create and run a new container from an image

Aliases:
  docker container run, docker run

常用选项

选项说明翻译
–name string
例如: –name=”redis_01″
Assign a name to the container为容器指定名称
-d, –detachRun container in background and print container ID在后台运行容器并打印容器ID
-i, –interactiveKeep STDIN open even if not attached保持标准输入方式打开,就是交互方式打开,一般需要配合-t一起使用
-t, –tty Allocate a pseudo-TTY分配一个伪TTY
-p
小写
Publish a container’s port(s) to the host将容器的端口发布到主机(端口映射)

demo

docker run -it ubuntu /bin/bash
root@94b4657b8cd3:/# 
root@94b4657b8cd3:/# pwd
/
root@94b4657b8cd3:/tmp# uname  -r
4.19.0-18-amd64
root@94b4657b8cd3:/tmp# uname  -a
Linux 94b4657b8cd3 4.19.0-18-amd64 #1 SMP Debian 4.19.208-1 (2021-09-29) x86_64 x86_64 x86_64 GNU/Linux
镜像名后面跟的是 shell

ps 显示正在运行的容器

列说明:
1、CONTAINER ID ->容器ID
2、IMAGE -> 镜像名
3、COMMAND -> shell
4、CREATED -> 创建时间
5、STATUS -> 状态 , Up 表示正在运行
6、PORTS -> 端口映射
7、NAMES -> 容器名称,创建时未指定则随机生成一个,自定义名字使用–name=”指定的名字”

常用选项

Options:
  -a, --all             Show all containers (default shows just running)
  -f, --filter filter   Filter output based on conditions provided
      --format string   Format output using a custom template:
                        'table':            Print output in table format with column headers (default)
                        'table TEMPLATE':   Print output in table format using the given Go template
                        'json':             Print in JSON format
                        'TEMPLATE':         Print output using the given Go template.
                        Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display container IDs
  -s, --size            Display total file sizes

退出启动删除容器

exit退出方式

此方式退出当前容器,并且停止容器!

demo

# 正在运行的容器实例
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    12 seconds ago   Up 11 seconds             tender_mendeleev
3ba6c1c9203d   ubuntu    "bash"    31 seconds ago   Up 29 seconds             fervent_jang
# ------------------
# 使用exit 退出容器id为3ba6c1c9203d的容器
root@clkj:~# docker run -it ubuntu
root@3ba6c1c9203d:/# exit
exit
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    About a minute ago   Up About a minute             tender_mendeleev

以上demo可以清晰的看到使用exit方式退出会自动停止容器实例

ctrl+p+q退出方式

此方式退出容器实例,不会停止容器实例

demo

root@2a0f280ac5f2:/# root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    5 minutes ago   Up 5 minutes             tender_mendeleev

上面的例子使用ctrl+p+q方式退出的,但是容器实例没有停止!

start启动容器

root@clkj:~# docker ps -n 2
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    9 minutes ago   Up 9 minutes                         tender_mendeleev
3ba6c1c9203d   ubuntu    "bash"    9 minutes ago   Exited (0) 7 minutes ago             fervent_jang
root@clkj:~# docker start 3ba6c1c9203d
3ba6c1c9203d
root@clkj:~# docker ps -n 2
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    9 minutes ago   Up 9 minutes             tender_mendeleev
3ba6c1c9203d   ubuntu    "bash"    9 minutes ago   Up 3 seconds             fervent_jang

restart重启容器

docker restart 3ba6c1c9203d

stop停止容器

docker stop 3ba6c1c9203d

kill强制停止

docker kill 3ba6c1c9203d
 提示:这几个命令后面可以使用容器ID也可以使用容器名称!
如: docker kill fervent_jang,fervent_jang是容器名称

rm删除已停止的容器

root@clkj:~# docker ps -n 2
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    16 minutes ago   Up 16 minutes                         tender_mendeleev
3ba6c1c9203d   ubuntu    "bash"    16 minutes ago   Exited (0) 59 seconds ago             fervent_jang

# 删除ID为3ba6c1c9203d的容器
root@clkj:~# docker rm 3ba6c1c9203d
3ba6c1c9203d

# 查看所有容器
root@clkj:~# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                    PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"        16 minutes ago   Up 16 minutes                       tender_mendeleev
94b4657b8cd3   ubuntu    "/bin/bash"   2 days ago       Exited (129) 2 days ago             interesting_elgamal
 警告:删除容器时需要先停止容器,然后再删除,也可以加 -f 选项强制删除,但是强烈不推荐这样操作!

守护式容器实例

启动一个守护式容器

root@clkj:~# docker run -d redis
2d72977d3bc3728ad2fd4b953aa9d67dacea654c4ac92057c2c7dd9fee75a43a
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
2d72977d3bc3   redis     "docker-entrypoint.s…"   4 seconds ago    Up 3 seconds    6379/tcp   intelligent_jemison

查看日志

root@clkj:~# docker logs 2d72977d3bc3
1:C 06 Apr 2023 15:43:01.332 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 06 Apr 2023 15:43:01.332 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 06 Apr 2023 15:43:01.332 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 06 Apr 2023 15:43:01.333 * monotonic clock: POSIX clock_gettime
1:M 06 Apr 2023 15:43:01.334 * Running mode=standalone, port=6379.
1:M 06 Apr 2023 15:43:01.334 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 06 Apr 2023 15:43:01.334 # Server initialized
1:M 06 Apr 2023 15:43:01.334 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 06 Apr 2023 15:43:01.335 * Ready to accept connections

查看容器内的进程

root@clkj:~# docker top 2d72977d3bc3
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
systemd+            4485                4463                0                   23:43               ?                   00:00:01            redis-server *:6379

查看容器内部细节

docker top 2d72977d3bc3

进入正在运行的容器

exex方式
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS      NAMES
2d72977d3bc3   redis     "docker-entrypoint.s…"   12 hours ago   Up 12 hours   6379/tcp   intelligent_jemison
2a0f280ac5f2   ubuntu    "bash"                   13 hours ago   Up 13 hours              tender_mendeleev
root@clkj:~# docker exec -it 2d72977d3bc3 /bin/bash
root@2d72977d3bc3:/data#
root@2d72977d3bc3:/data# exit
exit
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS        PORTS      NAMES
2d72977d3bc3   redis     "docker-entrypoint.s…"   13 hours ago   Up 13 hours   6379/tcp   intelligent_jemison
2a0f280ac5f2   ubuntu    "bash"                   13 hours ago   Up 13 hours              tender_mendeleev
attach方式
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED        STATUS        PORTS     NAMES
2a0f280ac5f2   ubuntu    "bash"    13 hours ago   Up 13 hours             tender_mendeleev

root@clkj:~# docker attach 2a0f280ac5f2
root@2a0f280ac5f2:/# exit
exit
root@clkj:~# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
两者的区别
1、exec方式进入容器后,使用exit退出时不会停止当前容器实例!
2、attach方式进入容器后,使用exit退出时会停止当前容器实例!

cp备份命令

  • 将容器内的文件备份到主机上
root@clkj:~# docker cp 94b4657b8cd3:/tmp/linuxcc.txt /tmp
Successfully copied 2.048kB to /tmp
root@clkj:~# cat /tmp/linuxcc.txt 
123
命令格式:docker cp 容器ID:容器内的文件路径 要备份的路径

镜像导入导出

export导出

root@clkj:~# docker export 94b4657b8cd3 > /tmp/ubuntu.tar

root@clkj:~# ll /tmp/ubuntu.tar -h
-rw-r--r-- 1 root root 72M Apr  7 12:35 /tmp/ubuntu.tar
命令格式:docker export 容器ID > 本地存放的路径和导出的文件名,必须已.tar结尾

import导入

root@clkj:~# cat /tmp/ubuntu.tar | docker import - linuxcc/ubuntu:20.04
sha256:9d50f58a4b6d40cd2fb7a7532912a2c946134cf980f179b16cc884e7f3ac68ff
root@clkj:~# docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
linuxcc/ubuntu   20.04     9d50f58a4b6d   13 seconds ago   72.8MB
redis            latest    7614ae9453d1   15 months ago    113MB
ubuntu           latest    ba6acccedd29   17 months ago    72.8MB
root@clkj:~# docker run -it 9d50f58a4b6d /bin/bash
root@0bb5e3808353:/# cat /tmp/linuxcc.txt 
123
命令格式:cat 需要导入的容器文件 | docker imort – 镜像仓库名称:版本号

commit

  • 提交创建新的镜像
root@clkj:~# docker commit -m="add vim" -a="linuxcc" 94b4657b8cd3 linuxcc/ubuntu:1.2
sha256:0b28807222dac5440574a7d2a9c0191636ce93bcadf32ec0012f1683270b4234
# 创建好后的镜像
root@clkj:~# docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED         SIZE
linuxcc/ubuntu   1.2       0b28807222da   3 minutes ago   183MB
命令格式:docker commit -m=”注释” -a=”作者” 对哪个容器实例创建新的镜像 镜像名:版本号

容器卷

概述

  • Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。
  • 卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
  • 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

数据卷的特点:

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

创建容器并绑定卷

root@clkj:~# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data ubuntu 

root@d05516d89591:/# cd /tmp/docker_data/
root@d05516d89591:/tmp/docker_data# echo 123 > test.txt
root@d05516d89591:/tmp/docker_data# cat test.txt
123
# 主机端
root@clkj:~# cd /tmp/host_data/
root@clkj:/tmp/host_data# cat test.txt 
123

参数说明:

选项/参数说明
–privileged=true授予此容器扩展权限
-v, –volume绑定装载卷

部署MySQL5.7

确认是否有镜像,没有就拉一个!

[root@docker ~] $ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB

创建实例命令

docker run -d \
--name mysql \
-p 3306:3306 \
--privileged=true \
-v /opt/mysql_data/log:/var/log/mysql \
-v /opt/mysql_data/data:/var/lib/mysql \
-v /opt/mysql_data/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123 mysql:5.7

执行后检查

[root@docker conf] $ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                               NAMES
bbefe7bd8517   mysql:5.7   "docker-entrypoint.s…"   8 minutes ago   Up 8 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

创建配置文件

[client]
default_character_set = utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

配置文件位置 /opt/mysql_data/conf/

配置文件创建后然后重启服务

docker restart mysql

查看配置是否生效

show variables like 'character%'

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
创作不易 请尊重他人劳动成果,未经授权禁止转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇