什么是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 镜像名:版本号 拉取的是指定版本号的镜像
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, –detach | Run container in background and print container ID | 在后台运行容器并打印容器ID |
-i, –interactive | Keep 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=”指定的名字”
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退出时会停止当前容器实例!
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)