ਜਾਣੋ ਕਿ Solomon Hykes ਅਤੇ Docker ਨੇ ਕੰਟੇਨਰਾਂ ਨੂੰ ਕਿਵੇਂ ਲੋਕਪ੍ਰਿਯ ਬਣਾਇਆ, Dockerfile, ਇਮੇਜ ਅਤੇ ਰਜਿਸਟਰੀਜ਼ ਨੂੰ ਆਧੁਨਿਕ ਐਪਾਂ ਦੀ ਪੈਕੇਜਿੰਗ ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਦਾ ਮਿਆਰ ਕਿਉਂ ਬਣਾਇਆ।

Solomon Hykes ਉਹ ਇੰਜੀਨੀਅਰ ਹਨ ਜਿਨ੍ਹਾਂ ਨੇ ਇੱਕ ਲੰਮੇ ਸਮੇਂ ਦੀ ਸੋਚ—ਸੌਫਟਵੇਅਰ ਨੂੰ ਐਸਾ ਆਈਸੋਲੇਟ ਕਰਨਾ ਤਾਂ ਕਿ ਉਹ ਹਰ ਥਾਂ ਇੱਕੋ ਤਰ੍ਹਾਂ ਚੱਲੇ—ਨੂੰ ਇੱਕ ਐਸਾ ਹਾਲ ਬਣਾਇਆ ਜੋ ਟੀਮਾਂ ਰੋਜ਼ਾਨਾ ਵਰਤ ਸਕਣ। 2013 ਵਿੱਚ, ਉਸ ਪ੍ਰਾਜੈਕਟ ਨੇ Docker ਦਾ ਰੂਪ ਲਿਆ, ਅਤੇ ਇਸ ਨੇ ਜਲਦੀ ਹੀ ਕੰਪਨੀਆਂ ਦੇ ਐਪ ਸ਼ਿਪ ਕਰਨ ਦੇ ਤਰੀਕੇ ਨੂੰ ਬਦਲ ਦਿੱਤਾ।
ਉਸ ਸਮੇਂ ਦਰਦ ਸਧਾਰਨ ਤੇ ਪਰਿਚਿਤ ਸੀ: ਇੱਕ ਐਪ ਡਿਵੈਲਪਰ ਦੇ ਲੈਪਟਾਪ 'ਤੇ ਚੰਗੀ ਤਰ੍ਹਾਂ ਚੱਲਦਾ, ਫਿਰ ਸਾਥੀ ਦੀ ਮਸ਼ੀਨ 'ਤੇ ਵੱਖਰਾ ਵਰਤੋਂ ਕਰਦਾ, ਅਤੇ ਫਿਰ ਸਟੇਜਿੰਗ ਜਾਂ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਦੁਬਾਰਾ ਟੁੱਟ ਜਾਂਦਾ। ਇਹ “ਇਨਕਨਸਿਸਟੈਂਟ ਵਾਤਾਵਰਣ” ਸਿਰਫ਼ ਪਰੇਸ਼ਾਨੀ ਨਹੀਂ ਸਨ—ਇਹ ਰਿਲੀਜ਼ ਨੂੰ ਧੀਮਾ ਕਰਦੇ, ਬੱਗਾਂ ਨੂੰ ਮੁਸ਼ਕਿਲ ਨਾਲ ਦੁਹਰਾਉਣਾ ਬਣਾਉਂਦੇ, ਅਤੇ ਡਿਵੈਲਪਮੈਂਟ ਅਤੇ ਓਪਰੇਸ਼ਨਜ਼ ਵਿਚ ਲੰਬੀਆਂ ਹੱਥ ਬਦਲਦੀਆਂ ਪੈਦਾ ਕਰਦੀਆਂ।
Docker ਨੇ ਟੀਮਾਂ ਨੂੰ ਇੱਕ ਦੁਹਰਾਏਜੋਗ ਤਰੀਕਾ ਦਿੱਤਾ ਜਿਸ ਨਾਲ ਐਪ ਨੂੰ ਉਸਦੀ ਉਮੀਦ ਕੀਤੀ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਦੇ ਨਾਲ ਪੈਕੇਜ ਕੀਤਾ ਜਾ ਸਕੇ—ਤਾਂ ਜੋ ਐਪ ਲੈਪਟਾਪ, ਟੈਸਟ ਸਰਵਰ ਜਾਂ ਕਲਾਉਡ 'ਚ ਇੱਕੋ ਜਿਹਾ ਚੱਲ ਸਕੇ।
ਇਸੇ ਲਈ ਲੋਕ ਕਹਿੰਦੇ ਹਨ ਕਿ ਕੰਟੇਨਰ "ਡਿਫਾਲਟ ਪੈਕੇਜਿੰਗ ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਯੂਨਿਟ" ਬਣ ਗਏ। ਸਧਾਰਨ ਤੌਰ 'ਤੇ:
“ਏਕ ZIP ਫਾਇਲ ਤੇ ਸੈਟਅਪ ਨਿਰਦੇਸ਼ਾਂ” ਨੂੰ ਡਿਪਲੋਏ ਕਰਨ ਦੀ ਬਜਾਏ, ਬਹੁਤ ਸਾਰੀਆਂ ਟੀਮਾਂ ਇੱਕ ਐਸੀ ਇਮੇਜ ਡਿਪਲੋਏ ਕਰਦੀਆਂ ਹਨ ਜਿਸ ਵਿੱਚ ਐਪ ਨੂੰ ਜੋ ਚਾਹੀਦਾ ਹੈ ਉਹ ਪਹਿਲਾਂ ਤੋਂ ਸ਼ਾਮਿਲ ਹੁੰਦਾ ਹੈ। ਨਤੀਜਾ: ਘੱਟ ਅਚੰਭੇ ਅਤੇ ਤੇਜ਼, ਅਨੁਮਾਨਯੋਗ ਰਿਲੀਜ਼।
ਇਹ ਲੇਖ ਇਤਿਹਾਸ ਅਤੇ ਕਾਰਗਿਰੀ ਸੰਕਲਪ ਨੂੰ ਮਿਲਾਉਂਦਾ ਹੈ। ਤੁਸੀਂ ਜਾਣੋਗੇ ਕਿ Solomon Hykes ਇਸ ਸੰਦਰਭ 'ਚ ਕੌਣ ਨੇ, Docker ਨੇ ਕੀ ਲਿਆਂਦਾ ਜੋ ਠੀਕ ਸਮੇਂ 'ਤੇ ਆਇਆ, ਅਤੇ ਮੁੱਢਲੇ ਮਿਕੈਨਿਕਸ—ਗਹਿਰੇ ਢਾਂਚਾਗਤ ਗਿਆਨ ਦੀ ਮੰਗ ਕੀਤੇ ਬਿਨਾਂ।
ਤੁਸੀਂ ਇਹ ਵੀ ਵੇਖੋਗੇ ਕਿ ਅੱਜ ਕੰਟੇਨਰ ਕਿੱਥੇ ਫਿੱਟ ਹੁੰਦੇ ਹਨ: CI/CD ਅਤੇ DevOps ਵਰਕਫਲੋਜ਼ ਨਾਲ ਕਿਵੇਂ ਜੁੜਦੇ ਹਨ, Kubernetes ਵਰਗੇ ਔਰਕੇਸਟਰਸ਼ਨ ਟੂਲ ਕਿਉਂ ਬਾਅਦ ਵਿੱਚ ਅਹਮ ਹੋਏ, ਅਤੇ ਕੰਟੇਨਰ ਆਪਣੇ ਆਪ ਕਿਹੜੀਆਂ ਗੱਲਾਂ ਸਹੀ ਨਹੀਂ ਕਰਦੇ (ਖ਼ਾਸ ਕਰਕੇ ਸੁਰੱਖਿਆ ਅਤੇ ਭਰੋਸੇ ਨਾਲ ਜੁੜੀਆਂ ਗੱਲਾਂ)।
ਅੰਤ ਤੱਕ, ਤੁਸੀਂ ਸਪਸ਼ਟ ਅਤੇ ਭਰੋਸੇਯੋਗ ਤਰੀਕੇ ਨਾਲ ਸਮਝਾ ਸਕੋਗੇ ਕਿ "ਇੱਕ ਕੰਟੇਨਰ ਵਜੋਂ ਭੇਜੋ" ਕਿਉਂ ਆਧੁਨਿਕ ਐਪ ਡਿਪਲਾਏਮੈਂਟ ਲਈ ਇੱਕ ਡਿਫਾਲਟ ਅਨੁਮਾਨ ਬਣ ਗਿਆ।
ਕੰਟੇਨਰਾਂ ਦੇ ਮੈਨਸਟ੍ਰੀਮ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ, ਡਿਵੈਲਪਰ ਦੇ ਲੈਪਟਾਪ ਤੋਂ ਸਰਵਰ ਤੱਕ ਇੱਕ ਐਪ ਲਿਜਾਣਾ ਆਮ ਤੌਰ 'ਤੇ ਲਿਖਣ ਤੋਂ ਜ਼ਿਆਦਾ ਦਰਦਨਾਕ ਹੁੰਦਾ ਸੀ। ਟੀਮਾਂ ਕੋਲ ਹੁਨਰ ਨਹੀਂ ਘੱਟ ਸੀ—ਉਹਨਾਂ ਕੋਲ “ਉਹ ਚੀਜ਼ ਜੋ ਕੰਮ ਕਰਦੀ ਹੈ” ਨੂੰ ਵਾਤਾਵਰਣਾਂ ਵਿਚ ਲਿਜਾਣ ਦਾ ਭਰੋਸੇਯੋਗ ਤਰੀਕਾ ਨਹੀਂ ਸੀ।
ਇੱਕ ਡਿਵੈਲਪਰ ਆਪਣੀ ਮਸ਼ੀਨ 'ਤੇ ਐਪ ਠੀਕ ਚਲਾ ਸਕਦਾ ਸੀ, ਫਿਰ ਇਹ ਸਟੇਜਿੰਗ ਜਾਂ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਫੇਲ ਹੋ ਜਾਂਦਾ। ਕਾਰਨ ਕੋਡ ਵਿੱਚ ਤਬਦੀਲੀ ਨਹੀਂ—ਬਲਕਿ ਵਾਤਾਵਰਣ ਵਿੱਚ ਹੁੰਦੀ ਸੀ। ਵੱਖਰੇ OS ਵਰਜ਼ਨ, ਗੁੰਮ ਲਾਇਬ੍ਰੇਰੀਆਂ, ਥੋੜ੍ਹੇ ਭਿੰਨ ਕੰਫਿਗ ਫਾਇਲਾਂ, ਜਾਂ ਡੇਟਾਬੇਸ ਦੇ ਵੱਖਰੇ defaults—ਇਹ ਸਭ ਇੱਕੋ ਬਿਲਡ ਨੂੰ ਟੁੱਟ ਸਕਦੇ ਸਨ।
ਬਹੁਤ ਪ੍ਰਾਜੈਕਟ ਲੰਬੀਆਂ ਤੇ ਨਾਜ਼ੁਕ ਸੈਟਅਪ ਹਦਾਇਤਾਂ 'ਤੇ ਨਿਰਭਰ ਹੁੰਦੇ ਸਨ:
ਹਰ ਚੀਜ਼ ਧੀਰੇ-ਧੀਰੇ ਬੁਰ੍ਹਦੀ ਸੀ। ਇੱਕ ਸਾਥੀ ਦੀ ਡੀਪੈਂਡੈਂਸੀ ਅਪਡੇਟ onboarding ਨੂੰ ਸਾਰਿਆਂ ਲਈ ਟੁੱਟ ਸਕਦੀ ਸੀ।
ਸ਼ਰਾਰੀ, ਇੱਕੋ ਸਰਵਰ 'ਤੇ ਦੋ ਐਪ ਨੂੰ ਇੱਕੋ ਰਨਟਾਈਮ ਜਾਂ ਲਾਇਬ੍ਰੇਰੀ ਦੇ ਵਿਭਿੰਨ ਸੰਸਕਰਣ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਸੀ, ਜੋ ਅਕਸਰ ਅਜਿਹੀਆਂ ਕੰਮਪਲੇਕਸ ਵਰਕਅਰਾਊਂਡ ਜਾਂ ਵੱਖਰੇ ਮਸ਼ੀਨਾਂ ਦੀ ਲੋੜ ਪੈਦਾ ਕਰ ਦਿੰਦਾ।
“ਪੈਕੇਜਿੰਗ” ਆਮ ਤੌਰ 'ਤੇ ZIP, tarball, ਜਾਂ ਇੱਕ ਇੰਸਟਾਲਰ ਬਣਾਉਣਾ ਹੁੰਦਾ ਸੀ। “ਡਿਪਲਾਇਮੈਂਟ” ਦਾ ਮਤਲਬ ਦੂਜੇ ਸਕ੍ਰਿਪਟ ਅਤੇ ਸਰਵਰ ਸਟੈਪ ਸਨ: ਮਸ਼ੀਨ ਪ੍ਰੋવિਜ਼ਨ ਕਰੋ, ਉਸਨੂੰ ਸੰਰਚਿਤ ਕਰੋ, ਫਾਇਲਾਂ ਨਕਲ ਕਰੋ, ਸੇਵਾਵਾਂ ਰੀਸਟਾਰਟ ਕਰੋ, ਅਤੇ ਆਸ ਕਰੋ ਕਿ ਹੋਰ ਕੁਝ ਪ੍ਰਭਾਵਿਤ ਨਾ ਹੋਵੇ।
ਇਹ ਦੋ ਚਿੰਤਾਵਾਂ ਕਦੇ ਸਾਫ਼-ਸੁਥਰੀ ਤਰ੍ਹਾਂ ਮਿਲਦੀਆਂ ਨਹੀਂ। ਪੈਕੇਜ ਨੇ ਉਸਦੀ ਜਰੂਰਤ ਵਾਲਾ ਵਾਤਾਵਰਣ ਪੂਰੀ ਤਰ੍ਹਾਂ ਵਰਣਨ ਨਹੀਂ ਕੀਤਾ, ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਪ੍ਰਕਿਰਿਆ ਟਾਰਗਟ ਸਰਵਰ ਦੇ "ਸਹੀ ਤਰ੍ਹਾਂ" ਤਿਆਰ ਹੋਣ 'ਤੇ ਨਿਰਭਰ ਸੀ।
ਟੀਮਾਂ ਨੂੰ ਇੱਕ ਐਸਾ ਇਕਾਈ ਚਾਹੀਦੀ ਸੀ ਜੋ ਆਪਣੇ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਨਾਲ ਸਫ਼ਰ ਕਰ ਸਕੇ ਅਤੇ ਲੈਪਟਾਪ, ਟੈਸਟ ਸਰਵਰ ਅਤੇ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਮੁਸਲਸਲ ਚਲ ਸਕੇ। ਦੁਹਰਾਏਜੋਗ ਸੈਟਅਪ, ਘੱਟ ਸੰਘਰਸ਼, ਅਤੇ ਅਨੁਮਾਨਯੋਗ ਡਿਪਲਾਇਮੈਂਟ ਦੀ ਦਬਾਅ ਨੇ ਕੰਟੇਨਰਾਂ ਨੂੰ ਐਪ ਭੇਜਣ ਦਾ ਡਿਫਾਲਟ ਤਰੀਕਾ ਬਣਾਉਣ ਲਈ ਮੰਚ ਤਿਆਰ ਕੀਤਾ।
Docker ਕੋਈ ਵੱਡੇ ਨਕਸ਼ੇ ਦੇ ਤਹਿਤ "ਸੌਫਟਵੇਅਰ ਨੂੰ ਸਦਾ ਲਈ ਬਦਲਣ" ਲਈ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋਇਆ। ਇਹ Practical engineering ਕੰਮ ਤੋਂ ਉਭਰਿਆ ਜੋ Solomon Hykes ਨੇ platform-as-a-service ਉਤਪਾਦ ਬਣਾਉਂਦਿਆਂ ਲੀਡ ਕੀਤਾ। ਟੀਮ ਨੂੰ ਐਪ ਨੂੰ ਵੱਖ-ਵੱਖ ਮਸ਼ੀਨਾਂ 'ਤੇ ਬਿਨਾਂ "ਮੇਰੇ ਮਸ਼ੀਨ 'ਤੇ ਚੱਲਦਾ ਹੈ" ਦੀਆਂ ਸਮੱਸਿਆਵਾਂ ਦੇ ਦੋਹਰਾਏ ਬਿਨਾਂ ਪੈਕੇਜ ਅਤੇ ਚਲਾਉਣ ਦਾ ਇੱਕ ਦੁਹਰਾਏਜੋਗ ਤਰੀਕਾ ਚਾਹੀਦਾ ਸੀ।
Docker ਨੂੰ ਘਰਾਉਣ ਵਾਲਾ ਪ੍ਰਾਜੈਕਟ ਇੱਕ ਆਤੰਰੀਕ ਹੱਲ ਵਜੋਂ ਉਭਰਿਆ—ਇਹ ਕੁਝ ਐਸਾ ਸੀ ਜਿਸ ਨਾਲ ਡਿਪਲਾਇਮੈਂਟ ਭਰੋਸੇਯੋਗ ਹੋ ਗਏ ਅਤੇ ਵਾਤਾਵਰਣ ਸਥਿਰ ਹੋ ਗਏ। ਜਦ ਟੀਮ ਨੇ ਸਮਝਿਆ ਕਿ ਇਹ ਮਕੈਨਿਸਮ ਆਪਣੇ ਹੀ ਉਤਪਾਦ ਤੋਂ ਬਾਹਰ ਵੀ ਲਾਭਦਾਇਕ ਹੈ, ਤਾਂ ਉਨ੍ਹਾਂ ਨੇ ਇਸਨੂੰ ਪਬਲਿਕ ਕੀਤਾ।
ਉਸ ਰਿਲੀਜ਼ ਨੇ ਪ੍ਰਾਇਵੇਟ ਡਿਪਲਾਇਮੈਂਟ ਤਕਨੀਕ ਨੂੰ ਇੱਕ ਸਾਂਝੇ ਟੂਲਚੇਨ ਵਿੱਚ ਬਦਲ ਦਿੱਤਾ, ਜਿਸਨੂੰ ਪੂਰੀ ਉਦਯੋਗ ਅਪਣਾ ਸਕਦੀ ਸੀ, ਸੁਧਾਰ ਸਕਦੀ ਸੀ, ਅਤੇ ਮਿਆਰੀਕ੍ਰਿਤ ਕਰ ਸਕਦੀ ਸੀ।
ਇਹ ਆਸਾਨੀ ਨਾਲ ਧੁੰਦਲੇ ਹੋ ਸਕਦੇ ਹਨ, ਪਰ ਉਹ ਵੱਖ ਹਨ:
ਕੰਟੇਨਰ Docker ਤੋਂ ਪਹਿਲਾਂ ਵੀ ਵੱਖ-ਵੱਖ ਰੂਪਾਂ ਵਿੱਚ ਮੌਜੂਦ ਸਨ। ਪਰ ਬਦਲਾਅ ਇਹ ਸੀ ਕਿ Docker ਨੇ ਵਰਕਫਲੋ ਨੂੰ ਡਿਵੈਲਪਰ-ਫ੍ਰੈਂਡਲੀ ਕਮਾਂਡਾਂ ਅਤੇ ਰੀਤੀ-ਰਿਵਾਜਾਂ ਵਿੱਚ ਪੈਕੇਜ ਕਰ ਦਿੱਤਾ—ਇਮੇਜ ਬਣਾਓ, ਇੱਕ ਕੰਟੇਨਰ ਚਲਾਓ, ਉਹਨੂੰ ਕਿਸੇ ਦੂਜੇ ਨਾਲ ਸਾਂਝਾ ਕਰੋ।
ਕੁਝ ਵਿਆਪਕ ਤੌਰ 'ਤੇ ਜਾਣੇ ਜਾਂਦੇ ਕਦਮਾਂ ਨੇ Docker ਨੂੰ “ਦਿਲਚਸਪ” ਤੋਂ “ਡਿਫਾਲਟ” ਤੱਕ ਧੱਕਾ ਦਿੱਤਾ:
ਪ੍ਰੈਕਟਿਕਲ ਨਤੀਜਾ: ਡਿਵੈਲਪਰਾਂ ਨੇ ਵਾਤਾਵਰਣ ਨਕਲ ਕਰਨ ਦੀ ਬਹਸ ਛੱਡ ਦਿੱਤੀ ਅਤੇ ਹਰ ਥਾਂ ਇੱਕੋ ਚਲਣ ਯੋਗ ਯੂਨਿਟ ਭੇਜਣ ਲੱਗੇ।
ਕੰਟੇਨਰ ਇੱਕ ਤਰੀਕਾ ਹੈ ਜਿਸ ਨਾਲ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪੈਕੇਜ ਅਤੇ ਚਲਾਇਆ ਜਾਂਦਾ ਹੈ ਤਾਂ ਜੋ ਉਹ ਤੁਹਾਡੇ ਲੈਪਟਾਪ, ਕਿਸੇ ਸਾਥੀ ਦੀ ਮਸ਼ੀਨ ਅਤੇ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਇੱਕੋ ਤਰ੍ਹਾਂ ਵਰਤੋਂ ਕਰੇ। ਮੁੱਖ ਵਿਚਾਰ ਹੈ ਵੱਡੀ ਨਵੀਂ ਮਸ਼ੀਨ ਬਿਨਾਂ ਆਈਸੋਲੇਸ਼ਨ।
VM ਇੱਕ ਪੂਰੇ ਫਲੈਟ ਦੇ ਕਿਰਾਏ 'ਤੇ ਲੈਣ ਵਰਗਾ ਹੈ: ਤੁਹਾਨੂੰ ਆਪਣਾ ਦਰਵਾਜ਼ਾ, ਆਪਣੀਆਂ ਯੂਟਿਲਿਟੀਜ਼ ਅਤੇ ਆਪਣਾ OS ਮਿਲਦਾ ਹੈ। ਇਸ ਲਈ VMs ਵੱਖ-ਵੱਖ OS ਚਲਾਉਣ ਦੇ ਯੋਗ ਹੁੰਦੇ ਹਨ, ਪਰ ਭਾਰੇ ਹੁੰਦੇ ਹਨ ਅਤੇ ਆਮ ਤੌਰ 'ਤੇ ਲੰਮੇ ਸਮੇਂ ਲਈ ਬੂਟ ਹੁੰਦੇ ਹਨ।
ਕੰਟੇਨਰ ਇੱਕ ਸਾਂਝੀ ਇਮਾਰਤ ਵਿੱਚ ਇੱਕ ਲੌਕ ਕੀਤੇ ਹੋਏ ਕਮਰੇ ਨੂੰ ਕਿਰਾਏ 'ਤੇ ਲੈਣ ਵਰਗਾ ਹੈ: ਤੁਸੀਂ ਆਪਣਾ ਫਰਨੀচার (ਐਪ ਕੋਡ + ਲਾਇਬ੍ਰੇਰੀਆਂ) ਲਿਆਉਂਦੇ ਹੋ, ਪਰ ਇਮਾਰਤ ਦੀਆਂ ਯੂਟਿਲਿਟੀਜ਼ (ਹੋਸਟ OS kernel) ਸਾਂਝੀਆਂ ਹੁੰਦੀਆਂ ਹਨ। ਤੁਸੀਂ ਹੋਰ ਕਮਰਿਆਂ ਤੋਂ ਵੱਖਰੇ ਰਹਿੰਦੇ ਹੋ, ਪਰ ਹਰ ਵਾਰੀ ਇਕ ਨਵਾਂ OS ਸ਼ੁਰੂ ਨਹੀਂ ਕਰਦੇ।
Linux 'ਤੇ, ਕੰਟੇਨਰ ਅੰਦਰੂਨੀ ਆਈਸੋਲੇਸ਼ਨ ਫੀਚਰਾਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ ਜੋ:
ਤੁਹਾਨੂੰ kernel ਦੀਆਂ ਤਕਨੀਕੀ ਵਿਸਥਾਰਾਂ ਜਾਣਨ ਦੀ ਲੋੜ ਨਹੀਂ ਤਾਂ ਕਿ ਤੁਸੀਂ ਕੰਟੇਨਰ ਵਰਤ ਸਕੋ, ਪਰ ਇਹ ਜਾਣਨਾ ਮਦਦਗਾਰ ਹੈ ਕਿ ਇਹ OS ਫੀਚਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੇ ਹਨ—ਕੋਈ ਜਾਦੂ ਨਹੀਂ।
ਕੰਟੇਨਰ ਲੋਕਾਂ ਨੂੰ ਇਸ ਲਈ ਪਸੰਦ ਆਏ ਕਿਉਂਕਿ ਉਹ:
ਕੰਟੇਨਰ ਡਿਫਾਲਟ ਰੂਪ ਵਿੱਚ ਸੁਰੱਖਿਆ ਦੀ ਸੀਮਾ ਨਹੀਂ ਹਨ। ਕਿਉਂਕਿ ਕੰਟੇਨਰ ਹੋਸਟ kernel ਨੂੰ ਸਾਂਝਾ ਕਰਦੇ ਹਨ, ਇੱਕ kernel-ਸਤਹ ਦੀ ਵਲਨਰੇਬਿਲਿਟੀ ਕਈ ਕੰਟੇਨਰਾਂ ਨੂੰ ਪ੍ਰਭਾਵਿਤ ਕਰ ਸਕਦੀ ਹੈ। ਇਸ ਦਾ ਇਹ ਵੀ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਬਿਨਾਂ ਵਾਧੂ ਵਰਚੁਅਲਾਈਜ਼ੇਸ਼ਨ ਦੇ Linux kernel 'ਤੇ Windows ਕੰਟੇਨਰ ਨਹੀਂ ਚਲਾ ਸਕਦੇ।
ਇਸ ਲਈ: ਕੰਟੇਨਰ ਪੈਕੇਜਿੰਗ ਅਤੇ ਸਥਿਰਤਾ ਵਿੱਚ ਸੁਧਾਰ ਲਿਆਉਂਦੇ ਹਨ—ਪਰ ਤੁਹਾਨੂੰ ਫਿਰ ਵੀ ਸਮਾਰਟ ਸੁਰੱਖਿਆ, ਪੈਚਿੰਗ ਅਤੇ ਕੰਫਿਗਰੇਸ਼ਨ ਅਭਿਆਸ ਲਾਗੂ ਕਰਨੇ ਆਉਣਗੇ।
Docker ਨੇ ਹਿੱਸਿਆਂ ਦਾ ਇੱਕ ਸਧਾਰਨ ਮਾਨਸਿਕ ਮਾਡਲ ਦਿੱਤਾ: ਇੱਕ Dockerfile (ਹਦਾਇਤਾਂ), ਇੱਕ ਇਮੇਜ (ਤਿਆਰ ਕੀਤੀ ਆਰਟੀਫੈਕਟ), ਅਤੇ ਇੱਕ ਕੰਟੇਨਰ (ਚੱਲਦਾ ਉਦਾਹਰਣ)। ਇਸ ਚੇਨ ਨੂੰ ਸਮਝ ਲੈਣ ਨਾਲ Docker ਏਕੋਸਿਸਟਮ ਦੇ ਬਾਕੀ ਹਿੱਸੇ ਸਹਿਜ ਸਮਝ ਆਉਂਦੇ ਹਨ।
Dockerfile ਇੱਕ ਪLAIN-ਟੈਕਸਟ ਫਾਇਲ ਹੈ ਜੋ ਤੁਹਾਡੇ ਐਪ ਪਰਿਵਾਰ ਦਾ ਨਿਰਮਾਣ ਕਦਮ-ਦਰ-কਦਮ ਵੇਰਵਾ ਦਿੰਦੀ ਹੈ। ਇਸਨੂੰ ਇਕ ਰੈਸੀਪੀ ਸਮਝੋ: ਇਹ ਆਪਣੇ ਆਪ ਕਿਸੇ ਨੂੰ ਖਿਲਾਉਂਦੀ ਨਹੀਂ, ਪਰ ਇਹ ਤੁਹਾਨੂੰ ਹਰ ਵਾਰੀ ਇੱਕੋ ਹੀ ਚੀਜ਼ ਤਿਆਰ ਕਰਨ ਦਾ ਨਿਰਦੇਸ਼ ਦਿੰਦੀ ਹੈ।
ਆਮ Dockerfile ਕਦਮਾਂ ਵਿੱਚ ਸ਼ਾਮਿਲ ਹੁੰਦਾ ਹੈ: ਇੱਕ ਬੇਸ ਚੁਣਨਾ (ਜਿਵੇਂ ਕਿਸੇ ਭਾਸ਼ਾ ਰਨਟਾਈਮ), ਆਪਣਾ ਐਪ ਕੋਡ ਕਾਪੀ ਕਰਨਾ, ਡੀਪੈਂਡੈਂਸੀਜ਼ ਇੰਸਟਾਲ ਕਰਨਾ, ਅਤੇ ਚਲਾਉਣ ਲਈ ਕਮਾਂਡ ਘੋਸ਼ਿਤ ਕਰਨਾ।
ਇਮੇਜ Dockerfile ਦਾ ਨਿਰਮਿਤ ਨਤੀਜਾ ਹੈ। ਇਹ ਸਾਰਾ ਕੁਝ ਪੈਕਡ ਸਨੈਪਸ਼ਾਟ ਹੈ: ਤੁਹਾਡਾ ਕੋਡ, ਡੀਪੈਂਡੈਂਸੀਜ਼, ਅਤੇ ਕੰਫਿਗ ਡਿਫੋਲਟ। ਇਹ "ਜੀਵਤ" ਨਹੀਂ—ਇਹ ਇੱਕ ਸੀਲ ਕੀਤੀ ਬਕਸੇ ਵਾਂਗ ਹੈ ਜਿਸਨੂੰ ਭੇਜਿਆ ਜਾ ਸਕਦਾ ਹੈ।
ਕੰਟੇਨਰ ਉਹ ਹੁੰਦਾ ਹੈ ਜਦ ਤੁਸੀਂ ਇੱਕ ਇਮੇਜ ਨੂੰ ਚਲਾਉਂਦੇ ਹੋ। ਇਹ ਇੱਕ ਲਾਈਵ ਪ੍ਰੋਸੈਸ ਹੈ ਜਿਸਦੀ ਆਪਣੀ ਆਈਸੋਲੇਟਡ ਫਾਈਲਸਿਸਟਮ ਅਤੇ ਸੈਟਿੰਗ ਹੁੰਦੀ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਸ਼ੁਰੂ ਕਰ ਸਕਦੇ ਹੋ, ਰੋਕ ਸਕਦੇ ਹੋ, ਰੀਸਟਾਰਟ ਕਰ ਸਕਦੇ ਹੋ, ਅਤੇ ਇੱਕੋ ਇਮੇਜ ਤੋਂ ਕਈ ਕੰਟੇਨਰ ਬਣਾਉ ਸਕਦੇ ਹੋ।
ਇਮੇਜ ਲੇਅਰਸ ਵਿੱਚ ਬਣਾਈਆਂ ਜਾਂਦੀਆਂ ਹਨ। Dockerfile ਦੀ ਹਰ ਨਿਰਦੇਸ਼ ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ਨਵਾਂ ਲੇਅਰ ਬਣਾਉਂਦਾ ਹੈ, ਅਤੇ Docker ਉਹਨਾਂ ਲੇਅਰਾਂ ਨੂੰ ਦੁਬਾਰਾ ਵਰਤਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦਾ ਹੈ ਜਿਹੜੀਆਂ ਬਦਲੀ ਨਹੀਂ।
ਸਧਾਰਨ ਭਾਸ਼ਾ ਵਿੱਚ: ਜੇ ਤੁਸੀਂ ਸਿਰਫ਼ ਆਪਣੇ ਐਪ ਕੋਡ ਨੂੰ ਬਦਲਦੇ ਹੋ, ਤਾਂ Docker ਅਕਸਰ ਉਹ ਲੇਅਰਾਂ ਦੁਬਾਰਾ ਵਰਤ ਸਕਦਾ ਹੈ ਜੋ OS ਪੈਕੇਜ ਅਤੇ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਬਣੀਆਂ ਸਨ, ਜਿਸ ਨਾਲ ਰੀਬਿਲਡ ਤੇਜ਼ ਹੋ ਜਾਂਦਾ ਹੈ। ਇਹ ਪ੍ਰੋਜੈਕਟਾਂ ਵਿਚ ਪੂਨਰਵਰਤਨ ਨੂੰ ਉਤਸ਼ਾਹਤ ਕਰਦਾ ਹੈ—ਬਹੁਤ ਸਾਰੀਆਂ ਇਮੇਜ ਇੱਕੋ ਬੇਸ ਲੇਅਰਾਂ ਨੂੰ ਸਾਂਝਾ ਕਰਦੀਆਂ ਹਨ।
ਇਹ "ਰੈਸੀਪੀ → ਆਰਟੀਫੈਕਟ → ਚੱਲਦਾ ਉਦਾਹਰਣ" ਫਲੋ ਹੈ:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]
docker build -t myapp:1.0 .docker run --rm -p 3000:3000 myapp:1.0ਇਹ ਕੁਝ ਮੂਲ ਵਾਅਦਾ ਹੈ ਜੋ Docker ਨੇ ਪ੍ਰਸਿੱਧ ਕੀਤਾ: ਜੇ ਤੁਸੀਂ ਇਮੇਜ ਬਣਾਉਣ ਦੀ ਸਮਰੱਥਾ ਰੱਖਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਇੱਕੋ ਚੀਜ਼ ਭਰੋਸੇਯੋਗ ਤਰੀਕੇ ਨਾਲ ਚਲਾ ਸਕਦੇ ਹੋ—ਲੈਪਟਾਪ, CI, ਜਾਂ ਸਰਵਰ 'ਤੇ—ਬਿਨਾਂ ਹਰ ਵਾਰੀ ਇੰਸਟਾਲੇਸ਼ਨ ਕਦਮ ਲਿਖਣ ਦੇ।
ਲੈਪਟਾਪ 'ਤੇ ਇੱਕ ਕੰਟੇਨਰ ਚਲਾਉਣਾ ਲਾਭਕਾਰੀ ਹੈ—ਪਰ ਇਹ ਬੜੀ ਤਬਦੀਲੀ ਨਹੀਂ। ਅਸਲ ਤਬਦੀਲੀ ਉਸ ਵੇਲੇ ਆਈ ਜਦ ਟੀਮਾਂ ਇੱਕ ਉਸੇ ਬਿਲਡ ਨੂੰ ਸਾਂਝਾ ਕਰ ਸਕਦੀਆਂ ਹਨ ਅਤੇ ਕਿਸੇ ਵੀ ਥਾਂ ਉਹਨੂੰ ਚਲਾ ਸਕਦੀਆਂ ਹਨ, "ਮੇਰੇ ਮਸ਼ੀਨ 'ਤੇ ਚੱਲਦਾ ਹੈ" ਵਾਲੀਆਂ ਦਲੀਲਾਂ ਤੋਂ ਬਿਨਾਂ।
Docker ਨੇ ਉਹ ਸਾਂਝਾ ਕਰਨ ਦਾ ਅਨੁਭਵ ਕੋਡ ਸਾਂਝਾ ਕਰਨ ਵਰਗਾ ਹੀ ਸਧਾਰਨ ਬਣਾ ਦਿੱਤਾ।
ਕੰਟੇਨਰ ਰਜਿਸਟਰੀ ਇੱਕ ਸਟੋਰ ਹੈ ਲਈ ਕੰਟੇਨਰ ਇਮੇਜਾਂ। ਜੇ ਇਮੇਜ ਪੈਕਡ ਐਪ ਹੈ, ਤਾਂ ਰਜਿਸਟਰੀ ਉਹ ਥਾਂ ਹੈ ਜਿੱਥੇ ਤੁਸੀਂ ਵਰਜਨ ਯੋਗ ਬਿਲਡ ਰੱਖਦੇ ਹੋ ਤਾਂ ਕਿ ਹੋਰ ਲੋਕ ਅਤੇ ਸਿਸਟਮ ਉਹਨੂੰ ਫੈਚ ਕਰ ਸਕਣ।
ਰਜਿਸਟਰੀ ਇੱਕ ਸਿੱਧਾ ਵਰਕਫਲੋ ਸਹਿਯੋਗ ਕਰਦੀ ਹੈ:
ਪਬਲਿਕ ਰਜਿਸਟਰੀਜ਼ (ਜਿਵੇਂ Docker Hub) ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਆਸਾਨ ਬਣਾਉਂਦੀਆਂ ਹਨ। ਪਰ ਜ਼ਿਆਦਾਤਰ ਟੀਮਾਂ ਨੂੰ ਜਲਦੀ ਹੀ ਉਹ ਰਜਿਸਟਰੀ ਚਾਹੀਦੀ ਹੈ ਜੋ ਉਨ੍ਹਾਂ ਦੀਆਂ ਪਹੁੰਚ ਨੀਤੀਆਂ ਅਤੇ ਕਨਪਲਾਇੰਸ ਲੋੜਾਂ ਨਾਲ ਮੇਲ ਖਾਂਦੀ ਹੋਵੇ।
ਇਮੇਜ ਆਮ ਤੌਰ 'ਤੇ name:tag ਨਾਲ ਪਛਾਣ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ—for example myapp:1.4.2. ਉਹ ਟੈਗ ਸਿਰਫ਼ ਇੱਕ ਲੇਬਲ ਨਹੀਂ: ਇਹ ਮਨੁੱਖਾਂ ਅਤੇ ਆਟੋਮੇਸ਼ਨ ਲਈ ਇਹ ਤੈਅ ਕਰਨ ਦਾ तरीका ਹੈ ਕਿ ਕਿਹੜਾ ਬਿਲਡ ਚਲਾਉਣਾ ਹੈ।
ਅਕਸਰ ਗਲਤੀ latest ਤੇ ਨਿਰਭਰ ਹੋਣਾ ਹੈ। ਇਹ ਆਸਾਨ ਸੁਣਦਾ ਹੈ, ਪਰ ਅਸਪਸ਼ਟ ਹੈ: “latest” ਬਿਨਾਂ ਚੇਤਾਵਨੀ ਦੇ ਬਦਲ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਵਾਤਾਵਰਣ ਡ੍ਰਿਫਟ ਹੋ ਸਕਦੇ ਹਨ।
ਚੰਗੀਆਂ ਆਦਤਾਂ:
1.4.2)ਜਦੋਂ ਤੁਸੀਂ ਅੰਦਰੂਨੀ ਸੇਵਾਵਾਂ, ਪੇਡ ਡੀਪੈਂਡੈਂਸੀਜ਼, ਜਾਂ ਕੰਪਨੀ ਕੋਡ ਸਾਂਝਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਆਮ ਤੌਰ 'ਤੇ ਪਰਾਈਵੇਟ ਰਜਿਸਟਰੀ ਦੀ ਲੋੜ ਪੈਂਦੀ ਹੈ। ਇਹ ਤੁਹਾਨੂੰ ਨਿਰਣਾਇਕ ਪਹੁੰਚ ਨਿਯੰਤਰਣ, ਸਿੰਗਲ ਸਾਇਨ-ਆਨ ਨਾਲ ਇੰਟੀਗ੍ਰੇਸ਼ਨ, ਅਤੇ ਪ੍ਰੋਪ੍ਰਾਈਟਰੀ ਸੌਫਟਵੇਅਰ ਨੂੰ ਪਬਲਿਕ ਇੰਡੈਕਸ ਤੋਂ ਬਚਾਉਣ ਦੀ ਆਜ਼ਾਦੀ ਦਿੰਦੀ ਹੈ।
ਇਹ "ਲੈਪਟਾਪ ਤੋਂ ਟੀਮ" ਕ਼ਦਮ ਹੈ: ਜਦ ਇਮੇਜ ਰਜਿਸਟਰੀ ਵਿਚ ਰਹਿੰਦੇ ਹਨ, ਤਾਂ ਤੁਹਾਡਾ CI ਸਿਸਟਮ, ਸਾਥੀ ਤੇ ਤੁਹਾਡੇ ਪ੍ਰੋਡਕਸ਼ਨ ਸਰਵਰ ਉਹੀ ਆਰਟੀਫੈਕਟ ਪੂਲ ਕਰ ਸਕਦੇ ਹਨ—ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਦੁਹਰਾਏਜੋਗ ਬਣ ਜਾਂਦਾ ਹੈ, ਨਾ ਕਿ ਤਿਆਰ ਕੀਤਾ ਗਿਆ।
CI/CD ਸਭ ਤੋਂ ਵਧੀਆ ਤਦੋਂ ਕੰਮ ਕਰਦਾ ਹੈ ਜਦ ਉਹ ਤੁਹਾਡੇ ਐਪ ਨੂੰ ਇੱਕ ਹੀ, ਦੁਹਰਾਏਜੋਗ "ਚੀਜ਼" ਵਜੋਂ ਕਦਰ ਕਰ ਸਕੇ। ਕੰਟੇਨਰ ਇਹੀ ਦਿੰਦੇ ਹਨ: ਇੱਕ ਪੈਕਡ ਆਰਟੀਫੈਕਟ (ਇਮੇਜ) ਜੋ ਤੁਸੀਂ ਇੱਕ ਵਾਰੀ ਬਣਾਉਂਦੇ ਹੋ ਅਤੇ ਬਹੁਤ ਵਾਰੀ ਚਲਾਉਂਦੇ ਹੋ, ਜ਼ਿਆਦਾ "ਮੇਰੇ ਮਸ਼ੀਨ 'ਤੇ ਚੱਲਦਾ ਹੈ" ਵਾਲੀਆਂ ਸਮੱਸਿਆਵਾਂ ਤੋਂ ਘੱਟ।
ਕੰਟੇਨਰਾਂ ਤੋਂ ਪਹਿਲਾਂ, ਟੀਮਾਂ ਅਕਸਰ ਲੰਬੇ ਸੈਟਅਪ ਡੌਕਸ ਅਤੇ ਸਾਂਝੇ ਸਕ੍ਰਿਪਟਾਂ ਨਾਲ ਵਾਤਾਵਰਣ ਮਿਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀਆਂ ਸਨ। Docker ਨਿਰਯਾਤ ਵਰਕਫਲੋ ਨੂੰ ਬਦਲ ਦਿੱਤਾ: repo ਪੂਲ ਕਰੋ, ਇਮੇਜ ਬਣਾਓ, ਐਪ ਚਲਾਓ। ਐਕੋ ਕਮਾਂਡ ਅਕਸਰ macOS, Windows, ਅਤੇ Linux 'ਤੇ ਇੱਕੋ ਜਿਹੇ ਕੰਮ ਕਰਦੇ ਹਨ ਕਿਉਂਕਿ ਐਪ ਕੰਟੇਨਰ ਦੇ ਅੰਦਰ ਚਲ ਰਿਹਾ ਹੁੰਦਾ ਹੈ।
ਇਹ ਸਟੈਂਡਰਡਾਈਜੇਸ਼ਨ onboarding ਤੇਜ਼ ਕਰਦੀ ਹੈ। ਨਵੀਆ ਟੀਮ ਮੈਂਬਰਾਂ ਨੂੰ dependencies ਇੰਸਟਾਲ ਕਰਨ 'ਤੇ ਘੱਟ ਸਮਾਂ ਲੱਗਦਾ ਹੈ ਅਤੇ ਉਹ ਜ਼ਿਆਦਾ ਸਮਾਂ ਉਤਪਾਦ ਸਮਝਣ 'ਤੇ ਦਾਂਵ ਲਾ ਸਕਦੇ ਹਨ।
ਮਜ਼ਬੂਤ CI/CD ਸੈੱਟਅਪ ਦਾ ਮਕਸਦ ਇੱਕ pipeline ਆਉਟਪੁੱਟ ਲਈ ਹੈ। ਕੰਟੇਨਰਾਂ ਨਾਲ, ਆਉਟਪੁੱਟ ਇੱਕ ਵਰਜਨ ਟੈਗ ਕੀਤੀ ਹੋਈ ਇਮੇਜ ਹੁੰਦੀ ਹੈ (ਅਕਸਰ commit SHA ਨਾਲ ਜੋੜੀ ਜਾਂਦੀ)। ਉਹ ਉਹੀ ਇਮੇਜ dev → test → staging → production ਤੱਕ ਪ੍ਰੋਮੋਟ ਹੁੰਦੀ ਹੈ।
ਵਾਤਾਵਰਣ ਮੁਤਾਬਕ ਅਲੱਗ-ਅਲੱਗ ਬਿਲਡ ਕਰਨ ਦੀ ਬਜਾਏ, ਤੁਸੀਂ ਕੰਫਿਗ (ਜਿਵੇਂ env vars) ਬਦਲਦੇ ਹੋ ਪਰ ਆਰਟੀਫੈਕਟ ਇੱਕੋ ਹੀ ਰਿਹਾ। ਇਸ ਨਾਲ ਵਾਤਾਵਰਣ ਡ੍ਰਿਫਟ ਘਟਦਾ ਅਤੇ ਰਿਲੀਜ਼ ਡੀਬੱਗ ਕਰਨਾ ਆਸਾਨ ਹੁੰਦਾ ਹੈ।
ਕੰਟੇਨਰ ਪਾਇਪਲਾਈਨ ਕਦਮਾਂ ਨਾਲ ਸਾਫ਼ ਮਿਲਦੇ ਹਨ:
ਕਿਉਂਕਿ ਹਰ ਕਦਮ ਇੱਕੋ ਪੈਕਡ ਐਪ 'ਤੇ ਚੱਲਦਾ ਹੈ, ਫੇਲਯਰ ਜ਼ਿਆਦਾ ਮਾਇਨੇ ਰੱਖਦੇ ਹਨ: CI 'ਚ ਪਾਸ ਹੋਇਆ ਟੈਸਟ ਬਾਅਦ ਡਿਪਲੋਏਟ 'ਚ ਵੀ ਇਸੇ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰਨ ਦੀ ਸੰਭਾਵਨਾ ਵੱਧ ਹੁੰਦੀ ਹੈ।
ਜੇ ਤੁਸੀਂ ਆਪਣੀ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਸੁਧਾਰਨਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਸਧਾਰਨ ਨਿਯਮ (tagging conventions, image signing, basic scanning) ਲਗਾਉਣਾ ਲਾਭਦਾਇਕ ਹੈ ਤਾਂ ਕਿ pipeline ਅਨੁਮਾਨਯੋਗ ਰਹੇ। ਜਿਵੇਂ-ਜਿਵੇਂ ਟੀਮ ਵਧਦੀ ਹੈ, ਤੁਸੀਂ ਪ੍ਰਕਿਰਿਆ ਵਧਾ ਸਕਦੇ ਹੋ (ਆਮ ਗਲਤੀਆਂ ਅਤੇ ਉਹਨਾਂ ਤੋਂ ਕਿਵੇਂ ਬਚਣਾ ਦੇ ਬਾਰੇ ਵੇਖੋ)।
ਜਿੱਥੇ ਇਹ ਮੌਡਰਨ “vibe-coding” ਵਰਕਫਲੋਜ਼ ਨਾਲ ਜੁੜਦਾ ਹੈ: ਪਲੇਟਫਾਰਮਾਂ ਜਿਵੇਂ Koder.ai ਚੈਟ ਇੰਟਰਫੇਸ ਰਾਹੀਂ ਫੁੱਲ-ਸਟੈਕ ਐਪ (React, Go + PostgreSQL, Flutter) ਤਿਆਰ ਅਤੇ ਇਟਰੇਟ ਕਰ ਸਕਦੀਆਂ ਹਨ—ਪਰ ਫਿਰ ਵੀ ਤੁਹਾਨੂੰ ਇੱਕ ਭਰੋਸੇਯੋਗ ਪੈਕੇਜਿੰਗ ਯੂਨਿਟ ਦੀ ਲੋੜ ਹੈ ਤਾਂ ਕਿ “ਇਹ ਚੱਲਦਾ ਹੈ” ਤੋਂ “ਇਹ ਭੇਜੋ” ਤੱਕ ਜਾ ਸਕੋ। ਹਰ ਬਣਾਈ ਹੋਈ ਬਿਲਡ ਨੂੰ ਵਰਜਨ ਕੀਤੀ ਇਮੇਜ ਵਜੋਂ ਰੱਖਣਾ AI-ਸਹਾਇਕ ਵਿਕਾਸ ਦੇ ਨਾਲ ਵੀ CI/CD ਉਮੀਦਾਂ (ਦੁਹਰਾਏਜੋਗ ਬਿਨੈ, ਅਨੁਮਾਨਯੋਗ ਡਿਪਲੋਇਜ਼, ਰੋਲਬੈਕ-ਤਰਤੀਆ) ਨਾਲ ਮੇਲ ਖਾਂਦਾ ਹੈ।
Docker ਨੇ ਇੱਕ ਵਾਰੀ ਐਪ ਪੈਕੇਜ ਕਰਕੇ ਕਿਸੇ ਵੀ ਥਾਂ ਚਲਾਉਣਾ ਅਮਲੀ ਕੀਤਾ। ਅਗਲਾ ਚੈਲੰਜ ਜਲਦੀ ਹੀ ਆ ਗਿਆ: ਟੀਮਾਂ ਇੱਕ ਕੰਟੇਨਰ ਇੱਕ ਲੈਪਟਾਪ 'ਤੇ ਨਹੀਂ ਚਲਾਉਂਦੀਆਂ—ਉਹ ਦਸਾਂ (ਫਿਰ ਸੌਂ) ਕੰਟੇਨਰਾਂ ਨੂੰ ਕਈ ਮਸ਼ੀਨਾਂ 'ਤੇ ਚਲਾਉਂਦੀਆਂ ਹਨ, ਅਤੇ ਵਰਜ਼ਨਾਂ ਭੀ ਲਗਾਤਾਰ ਬਦਲ ਰਹੀਆਂ ਹੁੰਦੀਆਂ ਹਨ।
ਉਸ ਸਮੇਂ "ਕੰਟੇਨਰ ਸ਼ੁਰੂ ਕਰਨਾ" ਮੁਸ਼ਕਲ ਹਿੱਸਾ ਰਹਿਣਾ ਛੱਡ ਦਿੰਦਾ ਹੈ। ਮੁਸ਼ਕਲ ਹੋ ਜਾਂਦਾ ਹੈ ਫਲੀਟ ਦਾ ਪ੍ਰਬੰਧ: ਕਿਹੜੇ ਕੰਟੇਨਰ ਕਿਸ ਮਸ਼ੀਨ 'ਤੇ ਚੱਲਣ, ਚੱਲ ਰਹੇ ਨਕਲਾਂ ਦੀ ਗਿਣਤੀ ਰੱਖਣਾ, ਅਤੇ ਜਦ ਕੁਝ ਫੇਲ ਹੋਵੇ ਤਾਂ ਖੁਦਕਾਰ ਢੰਗ ਨਾਲ ਬਹਾਲ ਕਰਨਾ।
ਜਦ ਤੁਹਾਡੇ ਕੋਲ ਕਈ ਕੰਟੇਨਰ ਕਈ ਸਰਵਰਾਂ 'ਤੇ ਹੁੰਦੇ ਹਨ, ਤਾਂ ਤੁਹਾਨੂੰ ਇਕ ਐਸਾ ਸਿਸਟਮ ਚਾਹੀਦਾ ਹੈ ਜੋ ਉਹਨਾਂ ਨੂੰ ਕੋਆਰਡੀਨੇਟ ਕਰੇ। ਇਹੀ ਕੰਟੇਨਰ ਔਰਕੇਸਟਰ ਕਰਦੇ ਹਨ: ਉਹ ਤੁਹਾਡੇ ਬੁਨਿਆਦੀ ਸਾਧਨਾਂ ਨੂੰ ਇੱਕ ਪੂਲ ਵਜੋਂ ਦੇਖਦੇ ਹਨ ਅਤੇ ਲਗਾਤਾਰ ਕੰਮ ਕਰਦੇ ਹਨ ਤਾਂ ਕਿ ਤੁਹਾਡੀਆਂ ਐਪਲਿਕੇਸ਼ਨਾਂ ਦੀ ਚਾਹੀਦੀ ਸਥਿਤੀ ਕਾਇਮ ਰਹੇ।
Kubernetes ਇਸ ਲੋੜ ਲਈ ਸਭ ਤੋਂ ਵਿਆਪਕ ਉੱਤਰ ਬਣ ਗਿਆ (ਹਾਲਾਂਕਿ ਇਹ ਇਕੱਲਾ ਵਿਕਲਪ ਨਹੀਂ)। ਇਹ ਕੁਝ ਝੰਡੇ ਤੇ APIs ਦਿੰਦਾ ਹੈ ਜਿਨ੍ਹਾਂ 'ਤੇ ਬਹੁਤ ਸਾਰੀਆਂ ਟੀਮਾਂ ਅਤੇ ਪਲੇਟਫਾਰਮ ਨੇ ਮਿਆਰੀਕਰਨ ਕੀਤਾ।
ਜ਼ਾਹਿਰ ਹੈ ਕਿ ਰੁਜ਼ਾਨਾ ਕੰਮ ਵੱਖ ਵੱਖ ਹੈ:
Kubernetes ਨੇ ਕੁਝ ਅਮਲਿਕ ਸਮਰੱਥਾਵਾਂ ਦਰਸਾਈਆਂ ਜੋ ਟੀਮਾਂ ਨੂੰ ਲੋੜੀਂਦੀਆਂ ਲੱਗੀਆਂ ਜਦ ਕੰਟੇਨਰ ਇੱਕ ਹੋਸਟ ਤੋਂ ਆਗੇ ਵੱਧ ਗਏ:
ਸੰਖੇਪ ਵਿੱਚ, Docker ਨੇ ਯੂਨਿਟ ਨੂੰ ਪੋਰਟੇਬਲ ਬਣਾਇਆ; Kubernetes ਨੇ ਉਸਨੂੰ ਕਈ ਯੂਨਿਟਾਂ ਦੇ ਹਲੇ-ਚਲੇ 'ਤੇ ਓਪਰੇਬਲ—ਭਰੋਸੇਯੋਗ ਅਤੇ ਲਗਾਤਾਰ—ਬਣਾ ਦਿੱਤਾ।
ਕੰਟੇਨਰਾਂ ਨੇ ਸਿਰਫ਼ ਡਿਪਲਾਇਮੈਂਟ ਦਾ ਤਰੀਕਾ ਨਹੀਂ ਬਦਲਿਆ—ਉਹਨਾਂ ਨੇ ਟੀਮਾਂ ਨੂੰ ਵੀ ਸੌਫਟਵੇਅਰ ਡਿਜ਼ਾਈਨ ਕਰਣ ਲਈ ਪ੍ਰੇਰਿਤ ਕੀਤਾ।
ਕੰਟੇਨਰਾਂ ਤੋਂ ਪਹਿਲਾਂ, ਐਪ ਨੂੰ ਛੋਟੇ-ਛੋਟੇ ਸੇروਸਾਂ 'ਚ ਵੰਡਣਾ ਅਕਸਰ ਚਿੰਤਾ ਵਧਾਉਂਦਾ ਸੀ: ਵੱਖਰੇ ਰਨਟਾਈਮ, ਟਕਰਾਉਂਦੇ ਡੀਪੈਂਡੈਂਸੀਜ਼, ਅਤੇ ਜਟਿਲ ਡਿਪਲਾਇਮੈਂਟ ਸਕ੍ਰਿਪਟ। ਕੰਟੇਨਰਾਂ ਨੇ ਇਹ ਘੰਟੀ ਘਟਾ ਦਿੱਤੀ। ਜੇ ਹਰ ਸੇਵਾ ਨੂੰ ਇੱਕ ਇਮੇਜ ਵਜੋਂ ਭੇਜਿਆ ਜਾਂਦਾ ਅਤੇ ਇੱਕੋ ਤਰੀਕੇ ਨਾਲ ਚਲਾਇਆ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਨਵੀਂ ਸੇਵਾ ਬਣਾਉਣਾ ਘੱਟ ਜੋਖਿਮ ਵਾਲਾ ਲੱਗਦਾ ਹੈ।
ਪਰ ਕਹਿਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਕੰਟੇਨਰ ਮੋਨੋਲੀਥਾਂ ਲਈ ਵੀ ਚੰਗੇ ਹਨ। ਇੱਕ ਮੋਨੋਲੀਥ ਇੱਕ ਕੰਟੇਨਰ ਵਿੱਚ ਹੋਰ ਜ਼ਿਆਦਾ ਸਾਦਾ ਹੋ ਸਕਦਾ ਹੈ—ਇੱਕ ਡਿਪਲੋਏਬਲ ਯੂਨਿਟ, ਇੱਕ ਲੌਗ ਸੈੱਟ, ਇੱਕ ਸਕੇਲਿੰਗ ਲੀਵਰ। ਕੰਟੇਨਰ ਕਿਸੇ ਵੀ ਸਟਾਈਲ ਨੂੰ ਮਜ਼ਬੂਤ ਬਣਾਉਂਦੇ ਹਨ—ਜੋ ਸਟਾਈਲ ਢੰਗ ਨਾਲ ਫਾਇਦਾ ਦਿੰਦੀ ਹੈ, ਉਸੇ ਨੂੰ ਅਪਣਾਉ।
ਕੰਟੇਨਰ ਪਲੇਟਫਾਰਮਾਂ ਨੇ ਐਪ ਨੂੰ ਇਕ "ਬਲੈਕ ਬਾਕਸ" ਵਾਂਗ ਚੱਲਣ ਲਈ ਉਤਸ਼ਾਹਤ ਕੀਤਾ ਜਿਸਦੇ ਪ੍ਰਵੇਸ਼ ਅਤੇ ਨਿਕਾਸ ਪੇਸ਼ਗੀ ਪਤਾ ਹੋਵੇ। ਆਮ ਰੀਤੀ-ਰਿਵਾਜ ਸ਼ਾਮਿਲ ਹਨ:
ਇਹ ਇੰਟਰਫੇਸ ਵਰਜ਼ਨਾਂ ਨੂੰ ਬਦਲਣਾ, ਰੋਲਬੈਕ ਨੂੰ ਆਸਾਨ ਕਰਨਾ, ਅਤੇ ਲੈਪਟਾਪ/CI/ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਇੱਕੋ ਐਪ ਚਲਾਉਣਾ ਆਸਾਨ ਬਣਾਉਂਦੇ ਹਨ।
ਕੰਟੇਨਰਾਂ ਨੇ ਦੁਹਰਾਏ ਜਾ ਸਕਣ ਵਾਲੇ ਇਮੈਨਿੰਗ ਬਲਾਕ—ਜਿਵੇਂ sidecars (ਮੁੱਖ ਐਪ ਦੇ ਨਾਲ ਲਗਦਾ ਸਹਾਇਕ ਕੰਟੇਨਰ ਲੌਗਿੰਗ, ਪ੍ਰਾਕਸੀ, ਜਾਂ ਸਰਟੀਫਿਕੇਟ ਲਈ)—ਪ੍ਰਸਿੱਧ ਕੀਤਾ। ਉਹ "ਇੱਕ ਪ੍ਰੋਸੈਸ ਪ੍ਰਤੀ ਕੰਟੇਨਰ" ਨਿਯਮ ਨੂੰ ਵੀ ਬਰਕਰਾਰ ਰੱਖਦੇ ਹਨ—ਕਠੋਰ ਨਿਯਮ ਨਹੀਂ, ਪਰ ਸਾਫ਼-ਸੁਥਰਾ default ਜੋ ਸਕੇਲ ਅਤੇ ਟ੍ਰਬਲਸ਼ੂਟਿੰਗ ਲਈ ਮਦਦ ਕਰਦਾ ਹੈ।
ਮੁੱਖ ਜਾਲ ਇਹ ਹੈ ਕਿ ਜਿਆਦਾ ਵਿਭਾਜਨ ਨਾ ਕਰੋ। ਸਿਰਫ ਇਸ ਲਈ ਕਿ ਤੁਸੀਂ ਹਰ ਚੀਜ਼ ਨੂੰ ਇੱਕ ਸੇਵਾ ਵਿੱਚ ਤਬਦੀਲ ਕਰ ਸਕਦੇ ਹੋ, ਇਹ ਲਾਜ਼ਮੀ ਨਹੀਂ ਕਿ ਤੁਸੀਂ ਕਰੋ। ਜੇ ਇੱਕ "ਮਾਈਕ੍ਰੋਸਰਵਿਸ" ਜ਼ਿਆਦਾ ਕੋਆਰਡੀਨੇਸ਼ਨ, ਲੇਟੰਸੀ ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਓਵਰਹੈੱਡ ਲਿਆਉਂਦੀ ਹੈ, ਤਾਂ ਜਦ ਤੱਕ ਸਪਸ਼ਟ ਬਾਊਂਡਰੀ (ਵੱਖਰਾ ਸਕੇਲਿੰਗ, ਮਾਲਕੀਅਤ, ਜਾਂ ਨੁਕਸਾਨ ਵੱਖਰਾ ਕਰਨ) ਨਾ ਹੋਵੇ, ਇਸਨੂੰ ਇਕੱਠਾ ਰੱਖੋ।
ਕੰਟੇਨਰ ਸੌਫਟਵੇਅਰ ਨੂੰ ਭੇਜਣਾ ਆਸਾਨ ਬਣਾਉਂਦੇ ਹਨ, ਪਰ ਉਹ ਇਸਨੂੰ ਆਪਣੇ ਆਪ ਮਹਫੂਜ਼ ਨਹੀਂ ਬਣਾਉਂਦੇ। ਇੱਕ ਕੰਟੇਨਰ ਅਜੇ ਵੀ ਸਿਰਫ਼ ਕੋਡ ਅਤੇ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਹੈ, ਅਤੇ ਇਹ ਗਲਤ ਕਨਫਿਗਰ ਕੀਤਾ, outdated, ਜਾਂ ਖ਼ਿਲਾਵਤੀ ਹੋ ਸਕਦਾ ਹੈ—ਖਾਸ ਕਰਕੇ ਜਦ ਇਮੇਜਾਂ ਇੰਟਰਨੈੱਟ ਤੋਂ ਘੱਟ ਜਾਂਚ ਨਾਲ ਪੂਲ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ।
ਜੇ ਤੁਸੀਂ ਜਵਾਬ ਨਹੀਂ ਦੇ ਸਕਦੇ "ਇਹ ਇਮੇਜ ਕਿੱਥੋਂ ਆਇਆ?" ਤਾਂ ਤੁਸੀਂ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਜੋਖਮ ਲੈ ਰਹੇ ਹੋ। ਟੀਮਾਂ ਆਮ ਤੌਰ 'ਤੇ ਇੱਕ ਸਪਸ਼ਟ ਚੇਨ ਆਫ ਕਸਟਡੀ ਵੱਲ ਵਧਦੀਆਂ ਹਨ: CI ਵਿੱਚ ਇਮੇਜ ਬਣਾਓ, ਜੋ ਬਣਿਆ ਉਸਦੀ ਸਾਇਨ ਜਾਂ attestation ਕਰੋ, ਅਤੇ ਰਿਕਾਰਡ ਰੱਖੋ ਕਿ ਇਮੇਜ ਵਿੱਚ ਕੀ ਸੀ (ਡੀਪੈਂਡੈਂਸੀ, ਬੇਸ ਇਮੇਜ ਵਰਜ਼ਨ, ਬਿਲਡ ਕਦਮ)।
ਇੱਥੇ SBOMs (Software Bills of Materials) ਮਦਦਗਾਰ ਹੁੰਦੇ ਹਨ: ਉਹ ਤੁਹਾਡੇ ਕੰਟੇਨਰ ਦੀ ਸਮੱਗਰੀ ਨੂੰ ਦਿੱਖਣਯੋਗ ਅਤੇ ਆਡੀਟ ਕਰਨ ਯੋਗ ਬਣਾਉਂਦੇ ਹਨ।
ਸਕੈਨਿੰਗ ਅਗਲਾ ਪ੍ਰਯੋਗਿਕ ਕਦਮ ਹੈ। ਨਿਯਮਤ ਢੰਗ ਨਾਲ ਇਮੇਜਾਂ ਨੂੰ ਵਲਨਰੇਬਿਲਿਟੀ ਲਈ ਸਕੈਨ ਕਰੋ, ਪਰ ਨਤੀਜਿਆਂ ਨੂੰ ਫੈਸਲੇ ਲਈ ਇਨਪੁਟ ਵਜੋਂ ਮੰਨੋ—ਇਹ ਸੁਰੱਖਿਆ ਦੀ ਗਾਰੰਟੀ ਨਹੀਂ।
ਇੱਕ ਆਮ ਗਲਤੀ ਕੰਟੇਨਰਾਂ ਨੂੰ ਬਹੁਤ ਜ਼ਿਆਦਾ ਅਧਿਕਾਰ ਦੇ ਕੇ ਚਲਾਉਣਾ ਹੈ—ਡਿਫਾਲਟ root ਯੂਜ਼ਰ, ਵੱਧ Linux capabilities, ਹੋਸਟ ਨੈੱਟਵਰਕਿੰਗ, ਜਾਂ privileged ਮੋਡ "ਕਰਕੇ ਇਹ ਕੰਮ ਕਰਦਾ ਹੈ"। ਇਹਨਾਂ ਵਿੱਚੋਂ ਹਰ ਇੱਕ ਗਲਤੀ ਹੋਣ 'ਤੇ ਬਲਾਸਟ ਰੇਡੀਅਸ ਵਧਾ ਦਿੰਦਾ ਹੈ।
ਸੈਕ੍ਰੇਟਸ ਇਕ ਹੋਰ ਫਸਾਅ ਹਨ। Environment variables, ਬੇਕ ਕੀਤੀਆਂ config ਫਾਈਲਾਂ, ਜਾਂ committed .env ਫਾਈਲਾਂ credentials ਲੀਕ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਪ੍ਰੇਫਰ ਕਰੋ ਕਿ ਸੈਕ੍ਰੇਟ ਸਟੋਰ ਜਾਂ ਔਰਕੇਸਟਰ ਦੀਆਂ ਮੈਨੇਜ ਕੀਤੀਆਂ ਸੇਕ੍ਰੇਟਸ ਵਰਤੋ ਅਤੇ ਉਨ੍ਹਾਂ ਨੂੰ ਘੁੰਮਾਉਂਦਾ ਸਮਝੋ ਜਿਵੇਂ ਕਿ ਪ੍ਰਕਟ ਹੋਣ ਦੀ ਸੰਭਾਵਨਾ ਹੈ।
"ਸਾਫ" ਇਮੇਜ ਵੀ ਰਨਟਾਈਮ 'ਚ ਖਤਰਨਾਕ ਹੋ ਸਕਦੇ ਹਨ। Docker sockets ਨੂੰ ਐਕਸਪੋਜ਼ ਕਰਨਾ, ਬਹੁਤ ਖੁੱਲੇ ਵਾਲਿਊਮ ਮਾਊਂਟ, ਅਤੇ ਕੰਟੇਨਰਾਂ ਨੂੰ ਅੰਦਰੂਨੀ ਸੇਵਾਵਾਂ ਤਕ ਪਹੁੰਚ ਦੇਣਾ ਜਿਹੜੀ ਦੀ ਲੋੜ ਨਹੀਂ—ਇਹ ਸਭ ਜੋਖਮ ਵਧਾਉਂਦੇ ਹਨ।
ਇਸਦੇ ਨਾਲ ਯਾਦ ਰੱਖੋ: ਹੋਸਟ ਅਤੇ kernel ਨੂੰ ਪੈਚ ਰੱਖਣਾ ਵੀ ਜ਼ਰੂਰੀ ਹੈ—ਕੰਟੇਨਰ kernel ਸਾਂਝਾ ਕਰਦੇ ਹਨ।
ਚਾਰ ਫੇਜ਼ਾਂ 'ਚ ਸੋਚੋ:
ਕੰਟੇਨਰ friction ਘਟਾਉਂਦੇ ਹਨ—ਪਰ ਭਰੋਸਾ ਫਿਰ ਵੀ ਕਮਾਇਆ, ਜਾਂਚਿਆ, ਅਤੇ ਲਗਾਤਾਰ ਬਰਕਰਾਰ ਰੱਖਣਾ ਪੈਂਦਾ ਹੈ।
Docker ਪੈਕੇਜਿੰਗ ਨੂੰ ਦੁਹਰਾਏਜੋਗ ਬਣਾਉਂਦਾ ਹੈ, ਪਰ ਸਿਰਫ਼ ਇੱਥੇ ਹੀ ਅਨੁਸ਼ਾਸਨ ਹੋਵੇ ਤਾਂ। ਕਈ ਟੀਮਾਂ ਇੱਕੋ ਹੀ ਗੜਬੜੀਆਂ 'ਚ ਫਸਦੀਆਂ ਹਨ—ਫਿਰ "ਕੰਟੇਨਰ" 'ਤੇ ਦੋਸ਼ ਲਾਉਂਦੀਆਂ ਹਨ ਜਦ ਇਹ ਵਰਕਫਲੋ ਸਮੱਸਿਆਵਾਂ ਹੁੰਦੀਆਂ ਹਨ।
ਇੱਕ ਧਾਰਨਾ ਵੱਡੀਆਂ ਬਿਹੱਦ ਭਾਰੀ ਇਮੇਜਾਂ ਬਣਾਉਣਾ ਹੈ: ਪੂਰੇ OS ਬੇਸ ਇਮੇਜ, runtime build ਟੂਲ ਜੋ runtime 'ਚ ਲੋੜੀਂਦੇ ਨਹੀਂ, ਅਤੇ ਪੂਰੇ ਰੇਪੋ (ਟੈਸਟ, ਡੌਕਸ, node_modules) ਦੀ ਕਾਪੀ। ਨਤੀਜਾ: ਹੌਲੀ ਡਾਊਨਲੋਡ, ਹੌਲੀ CI, ਅਤੇ ਸੁਰੱਖਿਆ ਲਈ ਵੱਧ ਸਤਹ।
ਹੋਰ ਇੱਕ ਆਮ ਮੁੱਦਾ ਧੀਮੇ, cache-busting ਬਿਲਡਸ ਹਨ। ਜੇ ਤੁਸੀਂ ਸਾਰੇ ਸੋਰਸ ਟ੍ਰੀ ਨੂੰ dependencies ਇੰਸਟਾਲ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਕਾਪੀ ਕਰਦੇ ਹੋ, ਤਾਂ ਹਰ ਛੋਟੇ ਕੋਡ ਬਦਲਾਅ ਤੇ ਪੂਰੀ dependency reinstall ਹੋਣੀ ਪੈਂਦੀ ਹੈ।
ਅਖੀਰਕਾਰ, ਟੀਮਾਂ ਅਕਸਰ ਅਸਪਸ਼ਟ ਜਾਂ ਤਰਲ ਟੈਗ ਵਰਗੇ latest ਜਾਂ prod ਵਰਤਦੀਆਂ ਹਨ। ਇਹ ਰੋਲਬੈਕ ਨੂੰ ਮੁਸ਼ਕਿਲ ਬਣਾਉਂਦਾ ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਨੂੰ ਅਨਿਸ਼্চਿਤ ਕਰ ਦਿੰਦਾ ਹੈ।
ਅਕਸਰ ਇਹ ਫਰਕ ਕੰਫਿਗਰੇਸ਼ਨ (ਗੁੰਮ env vars ਜਾਂ ਸੈਕ੍ਰੇਟਸ), ਨੈੱਟਵਰਕਿੰਗ (ਵੱਖਰੇ ਹੋਸਟਨੇਮ, ਪੋਰਟ, ਪ੍ਰੌਕਸੀ, DNS), ਜਾਂ ਸਟੋਰੇਜ (ਡੇਟਾ ਕੰਟੇਨਰ ਫਾਇਲਸਿਸਟਮ 'ਤੇ ਲਿਖਿਆ ਗਿਆ ਬਜਾਏ ਵੋਲਿਊਮ 'ਤੇ ਨਹੀਂ, ਜਾਂ ਫਾਇਲ ਪਰਮਿਸ਼ਨਾਂ) ਨਾਲ ਹੁੰਦਾ ਹੈ।
.dockerignore ਜਲਦੀ ਸ਼ਾਮਿਲ ਕਰੋFROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
CMD ["node","dist/server.js"]
ਜੇ ਐਪ ਬਹੁਤ ਸਧਾਰਨ ਹੈ (ਇੱਕ ਸਿੰਗਲ ਸਟੈਟਿਕ ਬਾਇਨਰੀ, ਬਰਸਤਾ ਹੀ ਸ਼ร้าน, ਕੋਈ ਸਕੇਲਿੰਗ ਜ਼ਰੂਰਤ ਨਹੀਂ), ਤਾਂ ਕੰਟੇਨਰ ਜੋੜਨਾ ਬੇਕਾਰ ਓਵਰਹੈਡ ਪੈਦਾ ਕਰ ਸਕਦਾ ਹੈ। ਲੇਗੇਸੀ ਸਿਸਟਮ ਜਿਹੜੇ OS coupling ਜਾਂ ਵਿਸ਼ੇਸ਼ ਹਾਰਡਵੇਅਰ ਡਰਾਈਵਰਾਂ 'ਤੇ ਨਿਰਭਰ ਹਨ ਵੀ ਬੁਰੇ ਫਿੱਟ ਹੋ ਸਕਦੇ ਹਨ—ਕਈ ਵਾਰੀ VM ਜਾਂ managed service ਸਾਫ਼-ਸੁਥਰਾ ਚੋਣ ਹੁੰਦੀ ਹੈ।
ਕੰਟੇਨਰ ਡਿਫਾਲਟ ਯੂਨਿਟ ਬਣ ਗਏ ਕਿਉਂਕਿ ਉਹ ਇੱਕ ਬਹੁਤ ਵਿਸ਼ੇਸ਼, ਦੁਹਰਾਏਜੋਗ ਦਰਦ ਨੂੰ ਹੱਲ ਕਰਦੇ ਹਨ: ਇੱਕੋ ਐਪ ਨੂੰ ਲੈਪਟਾਪ, ਟੈਸਟ ਸਰਵਰ, ਅਤੇ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਇੱਕੋ ਤਰ੍ਹਾਂ ਚਲਾਉਣ। ਐਪ ਅਤੇ ਉਸ ਦੀਆਂ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਨੂੰ ਇਕੱਠੇ ਪੈਕੇਜ ਕਰਨਾ ਡਿਪਲਾਇਮੈਂਟ ਤੇਜ਼, ਰੋਲਬੈਕ ਸੁਰੱਖਿਅਤ, ਅਤੇ ਟੀਮਾਂ ਵਿਚ ਹੱਥ-ਬਦਲ ਘੱਟ ਕਰਦਾ ਹੈ।
ਉਤਨਾ ਹੀ ਮਹੱਤਵਪੂਰਨ, ਕੰਟੇਨਰ ਨੇ ਵਰਕਫਲੋ ਨੂੰ ਸਟੈਂਡਰਡ ਕੀਤਾ: ਇੱਕ ਵਾਰੀ ਬਣਾਓ, ਭੇਜੋ, ਚਲਾਓ।
"ਡਿਫਾਲਟ" ਇਹ ਨਹੀਂ ਕਿ ਹਰ ਥਾਂ Docker ਚੱਲਦਾ ਹੈ। ਇਹ ਮਤਲਬ ਹੈ ਕਿ ਆਧੁਨਿਕ ਡਿਲਿਵਰੀ ਪਾਈਪਲਾਈਨਾਂ ਆਮ ਤੌਰ 'ਤੇ ਕੰਟੇਨਰ ਇਮੇਜ ਨੂੰ ਮੁੱਖ ਆਰਟੀਫੈਕਟ ਮੰਨਦੇ ਹਨ—ਇੱਕ ZIP ਫਾਇਲ, VM ਸਨੈਪਸ਼ਾਟ, ਜਾਂ ਹੱਥ-ਲਿਖੇ ਸੈਟਅਪ ਕਦਮਾਂ ਦੀ ਬਜਾਏ।
ਇਹ ਡਿਫਾਲਟ ਆਮ ਤੌਰ 'ਤੇ ਤਿੰਨ ਚੀਜ਼ਾਂ ਦੇ ਕਾਮਬਿਨੇਸ਼ਨ ਨੂੰ ਸ਼ਾਮਿਲ ਕਰਦਾ ਹੈ:
ਛੋਟੇ ਤੋਂ ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਦੁਹਰਾਏਜੋਗ 'ਤੇ ਧਿਆਨ ਦਿਓ।
.dockerignore ਸ਼ਾਮਿਲ ਕਰੋ।1.4.2, main, sha-…) ਪ੍ਰਕਾਸ਼ਿਤ ਕਰੋ ਅਤੇ ਪੂਸ਼/ਪੂਲ ਕਰਨ ਵਾਲਿਆਂ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰੋ।ਜੇ ਤੁਸੀਂ ਤੇਜ਼ ਵਿਕਾਸ ਤਰੀਕੇ (ਜਿਨ੍ਹਾਂ ਵਿੱਚ AI-ਸਹਾਇਤ ਤਰੀਕੇ ਸ਼ਾਮਿਲ ਹਨ) ਨਾਲ ਪ੍ਰਯੋਗ ਕਰ ਰਹੇ ਹੋ, ਤਾਂ ਉਹੀ ਅਨੁਸ਼ਾਸਨ ਰੱਖੋ: ਇਮੇਜ ਨੂੰ ਵਰਜ਼ਨ ਕਰੋ, ਇਸਨੂੰ ਰਜਿਸਟਰੀ ਵਿੱਚ ਸਟੋਰ ਕਰੋ, ਅਤੇ ਡਿਪਲਾਇਮੈਂਟ ਨੂੰ ਇੱਕੋ ਆਰਟੀਫੈਕਟ ਅੱਗੇ ਵਧਾਉਣ ਲਈ ਪ੍ਰੋਮੋਟ ਕਰੋ। ਇਹ ਇੱਕ ਕਾਰਨ ਹੈ ਕਿ Koder.ai ਵਰਗੀਆਂ ਟੀਮਾਂ ਲਈ ਵੀ ਕੰਟੇਨਰ-ਪਹਿਲਾਂ ਡਿਲਿਵਰੀ ਲਾਭਦਾਇਕ ਹੈ—ਤੇਜ਼ ਇਟਰੇਸ਼ਨ ਚੰਗੀ ਹੈ, ਪਰ ਦੁਹਰਾਏਜੋਗੀ ਅਤੇ ਰੋਲਬੈਕ-ਤਿਆਰ ਰਿਲੀਜ਼ਾਂ ਹੀ ਇਸਨੂੰ ਸੁਰੱਖਿਅਤ ਬਣਾਉਂਦੀਆਂ ਹਨ।
ਕੰਟੇਨਰ "ਮੇਰੇ ਮਸ਼ੀਨ 'ਤੇ ਚੱਲਦਾ ਹੈ" ਦੀ ਸਮੱਸਿਆ ਘਟਾਉਂਦੇ ਹਨ, ਪਰ ਉਹ ਚੰਗੇ ਓਪਰੇਸ਼ਨਲ ਅਭਿਆਸ ਨੂੰ ਬਦਲ ਕੇ ਨਹੀਂ ਦਿੰਦੇ। ਤੁਹਾਨੂੰ ਹੇਠਾਂ ਵਾਲੀਆਂ ਚੀਜ਼ਾਂ ਦੀ ਲੋੜ ਅਜੇ ਵੀ ਹੈ: ਮਾਨੀਟਰਿੰਗ, ਇੰਸੀਡੈਂਟ ਰਿਸਪਾਂਸ, ਸੈਕ੍ਰੇਟ ਮੈਨੇਜਮੈਂਟ, ਪੈਚਿੰਗ, ਐਕਸੈਸ ਕੰਟਰੋਲ, ਅਤੇ ਸਾਫ਼ ਮਾਲਕੀਅਤ।
ਕੰਟੇਨਰਾਂ ਨੂੰ ਇੱਕ ਸ਼ਕਤੀਸ਼ਾਲੀ ਪੈਕੇਜਿੰਗ ਮਿਆਰ ਸਮਝੋ—ਇੰਜੀਨੀਅਰਿੰਗ ਅਨੁਸ਼ਾਸਨ ਦੇ ਆਲੇ-ਦੁਆਲੇ ਇੱਕ شارਟਕਟ ਨਹੀਂ।
Solomon Hykes ਇੱਕ ਇੰਜੀਨੀਅਰ ਹਨ ਜਿਨ੍ਹਾਂ ਨੇ OS-ਸਤਹ ਦੀ ਆਧਾਰਿਤ ਆਈਸੋਲੇਸ਼ਨ (ਕੰਟੇਨਰ) ਨੂੰ ਡਿਵੈਲਪਰ-ਮੈਲਜੂਜ਼ ਹੋਣ ਵਾਲੇ ਵਰਕਫਲੋ ਵਿੱਚ ਬਦਲਣ ਦਾ ਨੇਤ੍ਰਿਤਵ ਕੀਤਾ। 2013 ਵਿੱਚ ਇਹ ਕੰਮ ਇੱਕ ਖੁਲ੍ਹੇ ਪ੍ਰਾਜੈਕਟ ਵਜੋਂ Docker ਦੇ ਤੌਰ 'ਤੇ ਰਿਲੀਜ਼ ਹੋਇਆ, ਜਿਸ ਨਾਲ ਟੀਮਾਂ ਲਈ ਐਪ ਅਤੇ ਉਸ ਦੀਆਂ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਇੱਕ ਹੀ ਤਰੀਕੇ ਨਾਲ ਹਰ ਏਨਵਾਇਰਨਮੈਂਟ 'ਚ ਚਲਾਉਣਾ ਅਸਾਨ ਹੋ ਗਿਆ।
ਕੰਟੇਨਰ ਨੀਂਹੀ ਸੰਕਲਪ ਹਨ: OS ਫੀਚਰਾਂ (ਜਿਵੇਂ Linux 'ਤੇ namespaces ਅਤੇ cgroups) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਈਸੋਲੇਟਡ ਪ੍ਰੋਸੈਸ। Docker ਉਹ ਟੂਲਿੰਗ ਅਤੇ ਰੀਤੀ-ਰਿਵਾਜ ਹੈ ਜਿਸ ਨੇ ਕੰਟੇਨਰਾਂ ਨੂੰ ਬਣਾਉਣਾ, ਚਲਾਉਣਾ ਅਤੇ ਸ਼ੇਅਰ ਕਰਨਾ ਆਸਾਨ ਕੀਤਾ (ਉਦਾਹਰਨ: Dockerfile → image → container). ਅੱਜ ਤੁਸੀਂ Docker ਦੇ ਬਿਨਾਂ ਵੀ ਕੰਟੇਨਰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰ Docker ਨੇ ਇਹ ਵਰਕਫਲੋ ਪ੍ਰਸਿੱਧ ਕੀਤਾ।
ਇਸ ਨੇ "works on my machine" ਸਮੱਸਿਆ ਹੱਲ ਕੀਤੀ—ਐਪ ਕੋਡ ਅਤੇ ਉਮੀਦ ਕੀਤੀ ਡੀਪੈਂਡੈਂਸੀਜ਼ ਨੂੰ ਇੱਕ ਦੁਹਰਾਏਜੋਗ, ਪੋਰਟੇਬਲ ਯੂਨਿਟ ਵਿੱਚ ਬੰਨ੍ਹ ਕੇ। ZIP ਫਾਇਲ ਅਤੇ ਸੈਟਅਪ ਨਿਰਦੇਸ਼ਾਂ ਦੀ ਬਜਾਏ, ਟੀਮਾਂ ਇੱਕ ਕੰਟੇਨਰ ਇਮੇਜ ਡਿਪਲੋਏ ਕਰਦੀਆਂ ਹਨ ਜੋ ਲੈਪਟਾਪ, CI, ਸਟੇਜਿੰਗ ਅਤੇ ਪ੍ਰੋਡਕਸ਼ਨ 'ਚ ਇੱਕੋ ਤਰ੍ਹਾਂ ਚਲ ਸਕਦੀ ਹੈ।
Dockerfile ਇੱਕ ਬਿਲਡ ਨੁਸਖਾ ਹੈ।
ਇਮੇਜ ਬਣੀ ਹੋਈ ਆਰਟੀਫੈਕਟ ਹੈ (immutable snapshot) ਜੋ ਸਟੋਰ ਅਤੇ ਸਾਂਝਾ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।
ਕੰਟੇਨਰ ਉਸ ਇਮੇਜ ਦਾ ਚੱਲਦਾ ਹੋਇਆ ਉਦਾਹਰਣ ਹੈ (ਜੀਵਤ ਪ੍ਰੋਸੈਸ ਜਿਸਦੀ ਆਪਣੀ ਆਈਸੋਲੇਟਡ ਫਾਇਲਸਿਸਟਮ/ਸੈਟਿੰਗ ਹੁੰਦੀ ਹੈ)।
Avoid latest ਕਿਉਂਕਿ ਇਹ ਅਸਪਸ਼ਟ ਹੈ ਅਤੇ ਬਿਨਾਂ ਚੇਤਾਵਨੀ ਦੇ ਬਦਲ ਸਕਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਵਾਤਾਵਰਣਾਂ ਵਿਚ ਡ੍ਰਿਫਟ ਹੋ ਸਕਦਾ ਹੈ।
Behtar ਤਰੀਕੇ:
1.4.2)ਇੱਕ ਰਜਿਸਟਰੀ ਕੰਟੇਨਰ ਇਮੇਜ਼ਾਂ ਲਈ ਸਟੋਰ ਹੈ। ਸੰਖੇਪ ਵਰਕਫਲੋ:
ਜਦੋਂ ਤੁਸੀਂ ਅੰਦਰੂਨੀ ਸੇਵਾਵਾਂ ਜਾਂ ਪ੍ਰਾਈਵੇਟ ਕੋਡ ਸਾਂਝਾ ਕਰਦੇ ਹੋ ਤਾਂ ਇੱਕ ਪਰਾਈਵੇਟ ਰਜਿਸਟਰੀ ਸਹੀ ਐਕਸੈਸ ਨਿਯੰਤਰਣ ਅਤੇ ਕੰਪਲਾਇੰਸ ਲਈ ਜ਼ਰੂਰੀ ਹੁੰਦੀ ਹੈ।
ਕੰਟੇਨਰ ਹੋਸਟ OS kernel ਸਾਂਝਾ ਕਰਦੇ ਹਨ, ਇਸ ਲਈ ਉਹ VM ਦੀ ਤਰ੍ਹਾਂ ਆਪਣਾ ਪੂਰਾ OS ਨਹੀਂ ਲੈਂਦੇ—ਇਸ ਕਾਰਨ ਉਹ ਹਲਕੇ ਤੇ ਤੇਜ਼ ਬੂਟ ਹੋ ਜਾਂਦੇ ਹਨ।
ਸਧਾਰਨ ਮਾਡਲ:
ਇੱਕ ਪ੍ਰਯੋਗਿਕ ਸੀਮਾ: ਤੁਸੀਂ ਆਮ ਤੌਰ 'ਤੇ Linux kernel 'ਤੇ Windows ਕੰਟੇਨਰ ਨਹੀਂ ਚਲਾ ਸਕਦੇ ਬਿਨਾਂ ਵਾਧੂ ਵਰਚੁਅਲਾਈਜ਼ੇਸ਼ਨ ਦੇ।
ਉਹ ਤੁਹਾਨੂੰ ਇੱਕੋ ਆਰਟੀਫੈਕਟ (ਇਮੇਜ) ਦਿੰਦੇ ਹਨ ਜਿਸਨੂੰ ਇੱਕ ਵਾਰੀ ਬਣਾਇਆ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਬਹੁਤ ਵਾਰ ਚਲਾਇਆ ਜਾ ਸਕਦਾ ਹੈ।
ਆਮ CI/CD ਪੈਟਰਨ:
ਤੁਸੀਂ ਵਾਤਾਵਰਣ ਅਨੁਸਾਰ ਕੰਫਿਗ (env vars/ਸਕੈਂਡ) ਬਦਲਦੇ ਹੋ—ਆਪ artifact ਨਹੀਂ—ਇਸ ਨਾਲ ਡ੍ਰਿਫਟ ਘਟਦਾ ਹੈ ਅਤੇ ਰੋਲਬੈਕ ਆਸਾਨ ਹੁੰਦਾ ਹੈ।
Docker ਇਕ-ਮਸ਼ੀਨ 'ਤੇ ਕੰਟੇਨਰ ਚਲਾਉਣਾ ਆਸਾਨ ਕੀਤਾ। ਸਕੇਲ ਉੱਤੇ, ਤੁਹਾਨੂੰ ਲੋੜ ਹੁੰਦੀ ਹੈ:
Kubernetes ਇਹ ਸਭ ਸਮਰੱਥਾਵਾਂ ਦਿੰਦਾ ਹੈ ਤਾਂ ਕਿ ਕਈ ਮਸ਼ੀਨਾਂ 'ਤੇ ਕੰਟੇਨਰ ਫਲੀਟ ਨੂੰ ਭਰੋਸੇਯੋਗ ਢੰਗ ਨਾਲ ਚਲਾਇਆ ਜਾ ਸਕੇ।
ਕੰਟੇਨਰ ਪੈਕੇਜਿੰਗ ਤੇ ਸਹੂਲਤ ਵਧਾਉਂਦੇ ਹਨ, ਪਰ ਉਹ ਆਪਣਾ ਆਪ ਸੁਰੱਖਿਆ ਨਹੀਂ ਦਿੰਦੇ। ਕੁਝ ਮੁੱਖ ਅੰਕ:
privileged, ਘੱਟ capabilities, ਸੰਭਵ ਹੋਵੇ ਤਾਂ root ਨਾ ਚਲਾਉ)ਰਾਹ-ਭੁੱਲਾਂ ਅਤੇ ਸਮੱਸਿਆਵਾਂ ਲਈ (ਜਿਵੇਂ ਵੱਡੀਆਂ ਇਮੇਜਾਂ, cache-busting builds, unclear tags) ਆਮ ਗਲਤੀਆਂ ਅਤੇ ਉਹਨਾਂ ਤੋਂ ਕਿਵੇਂ ਬਚਣਾ ਦੇ ਬਾਰੇ ਵੇਖੋ.