筆者來介紹一下docker 容器的學習
1、docker容器背景
docker 里面有兩個概念,鏡像可看成一個類,而容器則是鏡像的一個實例,從這個來看,那么一般鏡像是一個,而容器可以有很多個。
- 鏡像:帶一堆工具鏈的操作系統。
- 容器:鏡像的實例,可在此環境進行編譯等操作,用完之后可以刪除,也可以重復利用。
當然鏡像也可以有很多個,裝不同的環境,用的時候直接生成一個容器用即可。
2、docker環境搭建
- 安裝docker環境
sudo apt install docker.io
- 修改docker鏡像源
vim /etc/docker/daemon.json
"https://docker.registry.cyou"
"https://docker-cf.registry.cyou"
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi"
"https://dockertest.jsdelivr.fyi"
"https://mirror.aliyuncs.com".
"https://dockerproxy.com"
"https://mirror.baidubce .com"
"https://docker.m.daocloud.io”
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
"https://docker.mirrors.ustc.edu.cn"
"https://mirror.iscas.ac.cn"
"https://docker.rainbond.cc"
"https://udron5t9.mirror.aliyuncs.com
修改完源之后,確認可以正常拉取鏡像這工作正常。
3、docker 命令操作
-
拉取原始docker鏡像
-
重命名docker鏡像
docker tag ubuntu:20.04 linux:ubuntu_20
-
docker容器創建并進入(鏡像名稱 or 鏡像ID均可)
docker run -it linux:ubuntu_20
docker run -it d06b4ee4192a
- 進入已有docker環境
docker start 容器id // 啟動容器
docker exec -it 容器id /bin/bash // bash方式交互式進入容器
- docker容器環境進入(映射host與docker環境)
docker run --rm -it -w /root -v “$(pwd)/:/root” loooveos_linux:ubuntu_20
+ --rm:用完docker 容器就刪除
+ -it:交互式形式進入docker容器,不然就在host層進行訪問docker并執行操作
+ -w:指定docker 容器中的工作路徑
+ -v:將host的路徑映射到docker容器里面,“host路徑:docker容器路徑”
- docker 容器環境變更提交到docker鏡像
docker commit fab6e1f561b1 loooveos_linux:ubuntu_20
docker commit 容器id 鏡像名稱(or 鏡像ID)
commit 之后,可以看image的歷史記錄,docker history 鏡像
docker 容器是實例,可以實際操作并下載環境工具,這樣可以提交到鏡像,后續的鏡像就帶這樣的工具運行了,注意提交的時候,tag變更一下,這樣容器的版本歷史都在。
- docker 鏡像 保存與加載
docker save -o loooveos_linux.tar loooveos_linux:ubuntu_20
docker load -i loooveos_linux.tar
-
利用dockerfile 編譯docker鏡像
- 利用makefile + dockerfile 生成docker鏡像,
- dockfile 配置docker 鏡像的工具鏈,目錄以及環境變量等
- makefile可以用于執行docker命令,
dockerfie 如下
ARG UBUNTU_VERSION
FROM ubuntu:${UBUNTU_VERSION}.04# 安裝必要的工具
COPY sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y update &&\DEBIAN_FRONTEND=noninteractive apt-get install -y \gcc \pkg-config \make \wget \cmake \git \autoconf \automake \libtool \python \python3 \python3-dev \locales \unzip \subversion \texinfo \sshpass \patchelf \util-linux RUN mkdir /linux
RUN mkdir /linux/llvm
COPY ./llvm /linux/llvm
RUN mkdir /linux/marvell-gcc
COPY ./marvell-gcc-5.2.1-16.02.0 /linux/marvell-gcc
RUN mkdir /linux/llvm-linux
COPY ./LLVM-19.1.0-Linux-X64 /linux/llvm-linuxENV PATH="$PATH:/linux/llvm-linux/bin"
RUN echo $PATH
makfile如下:
.PHONY: all image# docker image名稱
TOOLCHAIN_DOCKER_IMAGE ?= linux:v1.1.0# Ubuntu默認使用20或18
UBUNTU_VERSION ?= 20all: image# 編譯docker image
image: docker build -f Dockerfile --network=host \--build-arg UBUNTU_VERSION=${UBUNTU_VERSION} \-t ${TOOLCHAIN_DOCKER_IMAGE} .
4、docker 編譯
- 非交互式命令,最后加bash -c “命令” 就可以進入docker 并執行相關命令。
- 筆者test_hello目錄下面有個hello.c文件,
- 可以執行 gcc hell0.c 并執行./a.out文件
- 當然也可以執行其他命令,比如makefile 或者python 腳本。
5、參考與注意事項
注意事項:拉取的docker鏡像源異常,無法下載,需要替換鏡像源,包括沒有基礎的vim命令,必須使用外部文件替換,無法本地直接操作。
docker 命令執行
linux@android-compile-server:~/test_docker$ make
docker build -f Dockerfile --network=host \--build-arg UBUNTU_VERSION=20 \-t linux:v1.1.0 .
Sending build context to Docker daemon 9.152GB
Step 1/14 : ARG UBUNTU_VERSION
Step 2/14 : FROM ubuntu:${UBUNTU_VERSION}.04---> b7bab04fd9aa
Step 3/14 : COPY sources.list /etc/apt/sources.list---> 78f6741b1441
Step 4/14 : RUN apt-get update---> Running in e1cfdf9d197f
Fetched 35.7 MB in 3s (13.3 MB/s)
Reading package lists...
Removing intermediate container e1cfdf9d197f---> 0fe273ff0e56
Step 5/14 : RUN apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get install -y gcc pkg-config make wget cmake git autoconf automake libtool python python3 python3-dev locales unzip subversion texinfo sshpass patchelf util-linux vim---> Running in 0b41ef457f62
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
util-linux is already the newest version (2.34-0.1ubuntu9.6).
The following additional packages will be installed:alsa-topology-conf alsa-ucm-conf autotools-dev binutils binutils-commonbinutils-x86-64-linux-gnu ca-certificates cmake-data cpp cpp-9 file gcc-9gcc-9-base git-man krb5-locales less libapr1 libaprutil1 libarchive13libasan5 libasn1-8-heimdal libasound2 libasound2-data libatomic1libauthen-sasl-perl libbinutils libbrotli1 libbsd0 libc-dev-bin libc6libc6-dev libcanberra0 libcbor0.6 libcc1-0 libcrypt-dev libctf-nobfd0libctf0 libcurl3-gnutls libcurl4 libdata-dump-perl libdpkg-perl libedit2libencode-locale-perl liberror-perl libexpat1 libexpat1-dev libfido2-1libfile-fcntllock-perl libfile-listing-perl libfont-afm-perl libgcc-9-devlibgdbm-compat4 libgdbm6 libglib2.0-0 libglib2.0-data libgomp1 libgpm2libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdallibheimntlm0-heimdal libhtml-form-perl libhtml-format-perllibhtml-parser-perl libhtml-tagset-perl libhtml-tree-perllibhttp-cookies-perl libhttp-daemon-perl libhttp-date-perllibhttp-message-perl libhttp-negotiate-perl libhx509-5-heimdal libicu66libio-html-perl libio-socket-ssl-perl libisl22 libitm1 libjsoncpp1libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3 libkrb5support0libldap-2.4-2 libldap-common liblocale-gettext-perl liblsan0 libltdl-devlibltdl7 liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgclibmagic1 libmailtools-perl libmpc3 libmpdec2 libmpfr6 libnet-http-perllibnet-smtp-ssl-perl libnet-ssleay-perl libnghttp2-14 libogg0 libperl5.30libpsl5 libpython2-stdlib libpython2.7-minimal libpython2.7-stdliblibpython3-dev libpython3-stdlib libpython3.8 libpython3.8-devlibpython3.8-minimal libpython3.8-stdlib libquadmath0 libreadline8 librhash0libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-dblibserf-1-1 libsigsegv2 libsqlite3-0 libssh-4 libssl1.1 libsvn1 libtdb1libtext-unidecode-perl libtimedate-perl libtry-tiny-perl libtsan0 libubsan1liburi-perl libutf8proc2 libuv1 libvorbis0a libvorbisfile3 libwind0-heimdallibwww-perl libwww-robotrules-perl libx11-6 libx11-data libxau6 libxcb1libxdmcp6 libxext6 libxml-libxml-perl libxml-namespacesupport-perllibxml-parser-perl libxml-sax-base-perl libxml-sax-expat-perllibxml-sax-perl libxml2 libxmuu1 linux-libc-dev m4 manpages manpages-devmime-support netbase openssh-client openssl patch perl perl-modules-5.30perl-openssl-defaults publicsuffix python2 python2-minimal python2.7python2.7-minimal python3-distutils python3-lib2to3 python3-minimalpython3.8 python3.8-dev python3.8-minimal readline-common shared-mime-infosound-theme-freedesktop tex-common tzdata ucf vim-common vim-runtime xauthxdg-user-dirs xxd xz-utils zlib1g-dev
Suggested packages: