目录
docker简介:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
什么是沙箱机制:
Sandbox(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。
docker的组成部分:
DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
Docker 架构:
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
docker run 参数
常用参数说明:
[root@localhost ~]# 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
# OPTIONS 说明
-d, --detach=false, 指定容器运行于前台还是后台,默认为false
-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false
-u, --user="", 指定容器的用户
-a, --attach=[], 登录容器(必须是以docker run -d启动的容器)
-w, --workdir="", 指定容器的工作目录
-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, --env=[], 指定环境变量,容器中可以使用该环境变量
-m, --memory="", 指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
有四种模式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
-h, --hostname="", 指定容器的主机名
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
# IMAGE 说明
要运行镜像的REPOSITORY:TAG或IMAGE ID
# COMMAND说明
需要在容器内执行的命令
# ARG 说明
指的是一些其他参数
docker部署
环境准备
卸载旧版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装依赖
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
下载阿里云仓库
wget http://mirrors.aliyun.com/repo/Centos-7.repo
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y epel-release
mv *.repo /etc/yum.repo.d/
安装docker
yum install -y docker-ce
开启docker
systemctl start docker.service
systemctl enable docker.service
systemctl status docker.service
docker version
安装docker-compose
github
的地址下载太慢了,国内可以使用http://get.daocloud.io/#install-compose网站上面的地址。
首先下载docker-compose
:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#授权
chmod +x /usr/local/bin/docker-compose
#最后查看版本
docker-compose -v
基本操作
下载服务的镜像
#docker下载Apache镜像
docker pull httpd
#docker下载Tomcat镜像
docker pull tomcat
导出镜像
#docker的镜像下载好后可以导出到本地,方便以后使用
#格式:docker save -o 导出后的名称 要导出的镜像
docker save -o centos_httpd httpd:latest
docker save -o centos_tomcat tomcat:latest
删除镜像
#删除镜像
#格式docker rmi 镜像ID/镜像REPOSITORY:TAG
docker rmi httpd:latest
docker rmi tomcat:latest
导入镜像
#把刚刚导出的镜像重新导入
格式:docker load < 名称
docker load < centos_httpd
docker load < centos_tomcat
启动服务并将端口映射到本机端口
docker run -itd -p 主机端口:docker端口 --name=名称 --privileged(超级特权) 镜像
例如
docker run -itd -p 80:80 --name=web01 --privileged httpd:latest
查看容器IP和路由
docker inspect --format='{{.NetworkSettings.IPAddress}}' ps中的ID号/name
or
iptables -t nat -L -n --line-numbers
docker cp
#从本地复制到docker容器内
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
docker cp [选项] 本地路径 容器ID:文件路径
例如:
docker cp /root/anaconda-ks.cfg db765f5a5883:/opt/anaconda-ks.cfg
[root@localhost ~]# docker cp /root/anaconda-ks.cfg db765f5a5883:/opt
Preparing to copy...
Copying to container - 3.072kB
Successfully copied 3.072kB to db765f5a5883:/opt
#从docker容器内复制到本地
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [选项] 容器ID:文件路径 本地路径
例如
docker cp db765f5a5883:/opt/anaconda-ks.cfg /root/anaconda-ks1.cfg
[root@localhost ~]# docker cp db765f5a5883:/opt/anaconda-ks.cfg /root/anaconda-ks1.cfg
Preparing to copy...
Copying from container - 512B
Copying from container - 1.861kB
Copying from container - 2.048kB
Copying from container - 2.56kB
Successfully copied 3.072kB to /root/anaconda-ks1.cfg
docker创建mysql容器
#首先下载mysql镜像
docker pull mysql
#创建容器并开启
docker run -itd -p 3306:3306 --name=mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
#效果,执行完的数字每个人都不一样
[root@localhost ~]# docker run -itd -p 3306:3306 --name=mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
97d97364eb9b2fe980034271c48c52dff3cecd0d38bd515b5c1340d6fc9df830
#docker ps -a查看
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
97d97364eb9b mysql:latest "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
#本地查看,有3306端口即可
[root@localhost ~]# netstat -anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 2014/docker-proxy
tcp 0 0 0.0.0.0:82 0.0.0.0:* LISTEN 2524/docker-proxy
tcp 0 0 0.0.0.0:83 0.0.0.0:* LISTEN 3350/docker-proxy
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1021/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1301/master
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4943/docker-proxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 708/rpcbind
tcp 0 0 192.168.100.10:22 192.168.100.254:52178 ESTABLISHED 1846/sshd: root@pts
tcp 0 0 192.168.100.10:22 192.168.100.254:57579 ESTABLISHED 1691/sshd: root@pts
tcp6 0 0 :::81 :::* LISTEN 2018/docker-proxy
tcp6 0 0 :::82 :::* LISTEN 2528/docker-proxy
tcp6 0 0 :::83 :::* LISTEN 3354/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1021/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1301/master
tcp6 0 0 :::3306 :::* LISTEN 4947/docker-proxy
tcp6 0 0 :::111 :::* LISTEN 708/rpcbind
#进入mysql容器查看版本
docker exec -it 97d9 mysql -uroot -p123456
select version();
docker创建redis容器
#首先下载redis镜像
docker pull redis
#将其他redis服务器的配置文件scp到docker服务器上
#修改配置文件相应内容
#创建redis容器
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis -v /root/redis.conf:/etc/redis/redis.conf -d redis:latest redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
[root@localhost ~]# docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -d redis:latest redis-server /etc/redis/redis.conf --appendonly yes --requirepass 000415
d66321472bdaf87a13f985cd271bf181ec4dc6eb8e2bf6f20c3b817584d29c53
#查看
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d66321472bda redis:latest "docker-entrypoint.s…" 8 seconds ago Up 8 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
#查看版本
docker exec -it redis redis-server -v
[root@localhost ~]# docker exec -it redis redis-server -v
Redis server v=7.0.10 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=abb4a9fa55bb4507
docker创建tomcat容器
#下载tomcat镜像
docker pull tomcat
#启动
[root@localhost ~]# docker run -itd -p 8080:8080 --name=tomcat --privileged tomcat:latest
f1a5ba6ce1c25a559edcdbef73db80ed63e9cc4b806a8a417eee15a647bf023c
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1a5ba6ce1c2 tomcat:latest "catalina.sh run" 17 seconds ago Up 16 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat
#进入tomcat
docker exec -it f1a5ba6ce1c2 /bin/bash
[root@localhost ~]# docker exec -it f1a5ba6ce1c2 /bin/bash
root@f1a5ba6ce1c2:/usr/local/tomcat#
#将webapps.dist/中内容复制到webapps,如果不复制的话,访问时会报错
root@f1a5ba6ce1c2:/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@f1a5ba6ce1c2:/usr/local/tomcat# ls webapps
root@f1a5ba6ce1c2:/usr/local/tomcat# ls webapps.dist/
docs examples host-manager manager ROOT
root@f1a5ba6ce1c2:/usr/local/tomcat# cp -r webapps.dist/* webapps/
docker迁移与备份
docker commit
#编写一个index.html文件
my name is zmy !!!
#将他复制到nginx容器
docker cp index.html 2c6e485a671c:/usr/share/nginx/html/index.html
#根据nginx容器创建一个新的镜像
docker commit 2c6e485a671c my_nginx
#启动这个新的容器,将端口映射到81号端口
docker run -itd -p 81:80 my_nginx:latest
#访问对比
[root@localhost ~]# curl 192.168.100.10
my name is lzz !!!
[root@localhost ~]# curl 192.168.100.10:81
my name is lzz !!!
结论
直接将一个运行的容器,直接打包成一个镜像,这个镜像里包含那个容器的所有配置
docker save和docker export的区别
1.docker save保存的是镜像,docker export保存的是容器
2.docker save会保留镜像所有的历史记录,docker export不会,即没有commit历史
3.docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
4.docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
docker export/import
#语法
docker export [OPTIONS] CONTAINER
Options:
-o, --output string Write to a file, instead of STDOUT #将输入内容写到文件。
例如:
#将redis打包
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db765f5a5883 ubuntu:22.10 "/bin/bash" 15 minutes ago Up 15 minutes myubuntu
a250e3354a34 redis:7.0.10 "docker-entrypoint.s…" 26 minutes ago Up 26 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis
b0815fd9ba92 python:3.11.3 "python3" About an hour ago Up About an hour mypython
[root@localhost ~]# docker export -o redis-`date +%Y%m%d`.tar a250e3354a34
[root@localhost ~]# ls
anaconda-ks.cfg redis-20230411.tar
#语法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
docker import [选项] 文件名 要起的镜像名:标签
Options:
-c, --change list Apply Dockerfile instruction to the created image #应用docker 指令创建镜像;
-m, --message string Set commit message for imported image #提交时的说明文字;
--platform string Set platform if server is multi-platform capable
例如:
#将刚刚保存的redis 导入docker
[root@localhost ~]# docker import redis-20230411.tar redis:import
sha256:e7a57daf9a697080d3abe725b0367ddbd566d6d7a72d2d42d16f461f87b777ec
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis import e7a57daf9a69 17 seconds ago 113MB
python 3.11.3 148bdd2c547f 5 days ago 921MB
redis 7.0.10 31f08b90668e 2 weeks ago 117MB
ubuntu 22.10 558d44db75c8 4 weeks ago 70.3MB