-d # 后台运行容器
-P # 发布容器所有暴露的端口到宿主上的随机端口
--name # 指定容器名称
-p # 指定宿主和容器的端口映射关系
--always # 容器退出时,重启策略
-v # 挂载宿主机目录到容器
-e # 设置环境变量
--link # 添加连接到另一个容器
# 创建容器,宿主随机映射容器端口
[root@ansible ~]# docker run -d -P --name=stargao_httpd docker.io/httpd:2.4
[root@ansible ~]# docker stop stargao_httpd # 停止运行容器
[root@ansible ~]# docker rm stargao_httpd # 删除容器
# 创建容器,宿主指定映射容器端口
[root@ansible ~]# docker run -d -p 8888:80 --restart=always --name=stargao_http docker.io/httpd:2.4
[root@ansible ~]# docker run -d -p 8888:80 \
-v /mnt/stargao_httpd:/usr/local/apache2/htdocs/ \
--name=stargao_httpd \
docker.io/httpd:2.4
# 注:-v前面是宿主文件路径,后面是容器文件路径;/mnt/stargao_httpd文件夹可以没有,系统会自动创建。
[root@ansible ~]# echo stargao >index.html
[root@ansible ~]# mv index.html /mnt/stargao_httpd/
[root@ansible ~]# curl 10.25.25.25:8888
# 删除容器,观察映射宿主目录文件是否仍存在
[root@ansible ~]# docker stop stargao_httpd
[root@ansible ~]# docker rm stargao_httpd
【注】映射容器文件路径到宿主,可起到持久化的作用。
[root@ansible ~]# docker exec -it stargao_httpd bash
/usr/local/apache2/conf/httpd.conf
/usr/local/apache2/conf/original/httpd.conf
# 将容器中的文件拷贝到宿主
[root@ansible ~]# docker cp stargao_httpd:/usr/local/apache2/conf/httpd.conf /mnt/
# 将宿主上的文件拷贝到容器
[root@ansible ~]# docker cp /mnt/stargao_httpd/index.html stargao_httpd:/mnt
[root@ansible ~]# docker run -d -p 33060:3306 \
-e MYSQL_ROOT_PASSWORD=redhat \
-e MYSQL_USER=stargao \
-e MYSQL_PASSWORD=stargao \
-v /mnt/stargao_mysql:/var/lib/mysql \
--name=stargao_mysql \
docker.io/mysql:5.5
官网介绍:https://hub.docker.com/_/mysql
【注】-e后面具体能够跟的参数类型,需要到官方镜像仓库查找。
# 登录验证
[root@ansible ~]# mysql -uroot -h10.25.25.25 -P33060 -predhat
【注】场景:容器之间相互调数据,进行通信。
# 将名为stargao_centos的容器连接到stargao_mysql的容器
[root@ansible ~]# docker run -it --name stargao_centos --link=stargao_mysql docker.io/centos:6.9
[root@ansible ~]# docker inspect stargao_centos
# 输出太多,过滤IP地址
[root@ansible ~]# docker inspect stargao_centos |grep IP
(1)运行容器时加环境变量
[root@ansible ~]# docker run -it --name stargao_nginx -e TZ="Asia/Shanghai" nginx
(2)将时区文件映射进容器
[root@ansible ~]# docker run -it --name stargao_nginx -e TZ="Asia/Shanghai" -v /etc/localtime:/etc/localtime nginx
(3)将时区信息封装到镜像中
(1)获取容器网络信息
[root@10-27-0-224 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b2b794e6271 registry.aliyuncs.com/openspug/spug "/entrypoint.sh" 27 hours ago Up 27 hours 0.0.0.0:80->80/tcp spug
[root@10-27-0-224 ~]# PID=$(docker inspect --format {{.State.Pid}} spug)
[root@10-27-0-224 ~]# nsenter -n -t $PID ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
71: eth0@if72: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default # 容器网卡信息
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
(2)获取容器对应宿主网卡信息
【注】71: eth0@if72 对应网卡信息 72: vethc4158b9@if71
[root@10-27-0-224 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1454 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:e2:ec:84 brd ff:ff:ff:ff:ff:ff
inet 10.27.0.224/24 brd 10.27.0.255 scope global eth0
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:bd:92:39:0d brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-36ce7f67bbf8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:f8:8f:b9:0d brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-36ce7f67bbf8
valid_lft forever preferred_lft forever
72: vethc4158b9@if71: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default # 容器对应宿主网卡
link/ether 06:ae:a2:ea:1a:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
(3)宿主上进行容器抓包
[root@10-27-0-224 ~]# tcpdump -i vethc4158b9 port 80 -A
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vethc4158b9, link-type EN10MB (Ethernet), capture size 262144 bytes
[root@ansible ~]# docker attach container_name # exit退出容器后,容器停止运行
[root@ansible ~]# docker exec -it container_name bash # exit退出容器后,容器依旧运行
[root@10-27-0-224 ~]# docker search crawlab
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tikazyq/crawlab Celery-based web crawler admin platform 14
docker top命令是用来查看一个容器里面的进程信息的,比如你想查看一个wiki容器里面有几个wiki进程的时候,就可以这么做
[root@10-27-0-224 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0727b303968d requarks/wiki:2 "docker-entrypoint.s…" 8 hours ago Up 8 hours 3443/tcp, 0.0.0.0:80->3000/tcp root_wiki_1
[root@10-27-0-224 ~]# docker top 0727b303968d
UID PID PPID C STIME TTY TIME CMD
1000 86085 86064 0 03:04 ? 00:00:46 node server
docker events可以帮助你实时获取docker的各种事件信息
[root@10-27-0-224 ~]# docker events
2021-09-13T10:47:41.483461551-05:00 container kill 0727b303968d814bcc52bb69279c5046f879012c840a077bb3c6809c54915433 (com.azure.dev.image.build.sourceversion=d5a5820c2f59e1315b5ba225809167f855a0131f, com.azure.dev.image.system.teamfoundationcollectionuri=https://dev.azure.com/requarks/, com.docker.compose.config-hash=5dde9c6ee86b9bfc5e015f36805f7e4c25cfb189965d0503d5429d554723919c, com.docker.compose.container-number=1, com.docker.compose.oneoff=False, com.docker.compose.project=root, com.docker.compose.service=wiki, com.docker.compose.version=1.18.0, image=requarks/wiki:2, image.base.ref.name==assets /wiki/server/views ./server/views, maintainer=requarks.io, name=root_wiki_1, signal=15)
当你docker run 了之后却发现里面有一些参数并不是你想要的状态比如你设置的nginx容器cpu或者内存太小,这个时候你就可以使用docker update去修改这些参数
[root@10-27-0-224 ~]# docker update nginx --cpus 2
#设置容器跟随Docker启动,docker ps查看容器id号
[root@ansible ~]# docker update --restart=always 容器id号
当你修改了一个镜像,但是忘记了每一层的修改命令,或者你想查看一个镜像是怎么构建的时候就可以使用这个命令,比如
[root@10-27-0-224 ~]# docker history redis:4-alpine
IMAGE CREATED CREATED BY SIZE COMMENT
e3dd0e49bca5 16 months ago /bin/sh -c #(nop) CMD ["redis-server"] 0B
<missing> 16 months ago /bin/sh -c #(nop) EXPOSE 6379 0B
<missing> 16 months ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 16 months ago /bin/sh -c #(nop) COPY file:c48b97ea65422782… 377B
<missing> 16 months ago /bin/sh -c #(nop) WORKDIR /data 0B
<missing> 16 months ago /bin/sh -c #(nop) VOLUME [/data] 0B
<missing> 16 months ago /bin/sh -c mkdir /data && chown redis:redis … 0B
<missing> 16 months ago /bin/sh -c set -eux; apk add --no-cache --… 13.5MB
<missing> 16 months ago /bin/sh -c #(nop) ENV REDIS_DOWNLOAD_SHA=1e… 0B
<missing> 16 months ago /bin/sh -c #(nop) ENV REDIS_DOWNLOAD_URL=ht… 0B
<missing> 16 months ago /bin/sh -c #(nop) ENV REDIS_VERSION=4.0.14 0B
<missing> 16 months ago /bin/sh -c apk add --no-cache 'su-exec>=0.… 1.35MB
<missing> 16 months ago /bin/sh -c addgroup -S -g 1000 redis && addu… 4.67kB
<missing> 16 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 16 months ago /bin/sh -c #(nop) ADD file:b91adb67b670d3a6f… 5.61MB
docker stats是docker内置的监控命令,当你想要查看当前主机下所有容器占用内存和cpu的情况的时候就可以使用这个命令。
[root@10-27-0-224 ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
fdcb78105ab8 root_db_1 0.03% 38.04MiB / 3.715GiB 1.00% 870kB / 654kB 0B / 55.6MB 7
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
fdcb78105ab8 root_db_1 0.03% 38.04MiB / 3.715GiB 1.00% 870kB / 654kB 0B / 55.6MB 7
当你运行了一个容器,但是你不知道容器里修改了哪一些文件的时候可以使用这个命令,比如
[root@10-27-0-224 ~]# docker diff root_db_1
C /run
C /run/postgresql
A /run/postgresql/.s.PGSQL.5432
A /run/postgresql/.s.PGSQL.5432.lock
[root@ansible ~]# docker logs stargao_centos # 查看日志排错
[root@ansible ~]# docker port nginx01 # 查看端口映射
80/tcp -> 0.0.0.0:8080
[root@ansible ~]# docker ps -a # 查看所有容器
[root@ansible ~]# docker rm -f $(docker ps -q -a) # 删除所有容器
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。